У новичка Скала возникают проблемы с Option, что эквивалентно троичному оператору - PullRequest
5 голосов
/ 02 апреля 2012

Я уже читал, что оператор if в scala всегда возвращает выражение

Итак, я пытаюсь сделать следующее (псевдокод)

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

заказ является опцией [String]

Я просто хочу иметь необязательный параметр для метода, и если этот параметр (в данном случае) не передается, просто пропустите его

Какой самый идиоматичный способ добиться того, что я пытаюсь сделать?

- редактировать -

Полагаю, я слишком торопился спросить

Я нашел этот путь,

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

Это правильный способ сделать это?

Я думал, карта предназначена для других целей ...

Ответы [ 2 ]

11 голосов
/ 02 апреля 2012

Прежде всего, вы не используете 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 с (пропуская скобки вокруг if):

"select * from xx" + (if(order.isDefined) {" order by " + order.get} else {""})
0 голосов
/ 02 апреля 2012

... или, если вы действительно хотите произвести впечатление на своих друзей:

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

(я все равно рекомендовал бы ответ Томаша, но я думаю, что этот вопрос не включен в шпаргалку scala.Option,так что я думал, что упомяну это)

...