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チートシートをご覧ください。ifしかし、本当にs の醜い方法 ( の周りに括弧がありません)に行きたい場合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 に答える