5

我已经读过 scala 中的 if 语句总是返回一个表达式

所以我正在尝试执行以下操作(伪代码)

sql = "select * from xx" + iif(order.isDefined, "order by " order.get, "")

我正在尝试

val sql: String = "select * from xx" + if (order.isDefined) {" order by " + order.get} else {""} 

但我得到这个错误:

illegal start of simple expression

订单是一个选项[字符串]

我只想为方法提供一个可选参数,如果未传递该参数(在这种情况下为顺序),则跳过它

实现我想要做的最惯用的方法是什么?

- 编辑 -

我想我问得太匆忙了

我找到了这种方式,

val orderBy = order.map( " order by " + _ ).getOrElse("")

这是正确的方法吗?

我以为地图是为了其他目的......

4

2 回答 2

11

首先,您没有Option[T]习惯性地使用,请尝试以下操作:

"select * from xx" + order.map(" order by " + _).getOrElse("")

或使用不同的语法:

"select * from xx" + (order map {" order by " + _} getOrElse "")

大致相当于:

"select * from xx" + order match {
  case Some(o) => " order by " + o
  case None => ""
}

看看scala.Option备忘单。但是,如果您真的想采用ifs 的丑陋方式(缺少括号if):

"select * from xx" + (if(order.isDefined) {" order by " + order.get} else {""})
于 2012-04-01T21:48:31.733 回答
0

...或者,如果你真的想给你的朋友留下深刻印象:

order.foldLeft ("") ((_,b)=>"order by  " + b)

(我仍然会推荐 Tomasz 的答案,但我认为这个不包含在 scala.Option 备忘单中,所以我想我会提到它)

于 2012-04-02T17:56:37.177 回答