【问题标题】:scala newbie having troubles with Option, what's the equivalent of the ternary operatorscala新手遇到Option问题,相当于三元运算符
【发布时间】:2012-04-01 21:44:54
【问题描述】:

我已经读过 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

order 是一个 Option[String]

我只想为方法添加一个可选参数,如果没有传递该参数(在本例中为顺序),则跳过它

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

-- 编辑--

我想我问得太匆忙了

我是这样找到的,

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

这是正确的做法吗?

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

【问题讨论】:

  • 您的代码无法编译的原因是您需要在if 表达式周围加上括号。但正如 Tomasz Nurkiewicz 指出的那样,无论如何都有更好的方法来编写它。
  • 有人想评论 为什么 我们需要在 if 表达式周围加上括号(“因为它可以编译”除外)?
  • @LuigiPlinge 这只是推测,但可能是他们想避免程序员混淆1 + if (b) 2 else 3 + 4 这样的表达式如何关联。是1 + (if (b) 2 else 3) + 4 还是1 + (if (b) 2 else 3 + 4)?当然,您可以使用一种语法来解决这种歧义(Haskell 确实如此),但这并不意味着人们不会犯错误,因为他们假设了不同的行为。
  • @pelotom 有道理,谢谢

标签: scala scala-option


【解决方案1】:

首先你没有习惯性地使用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 Cheat Sheet。但是,如果您真的想走ifs 的丑陋方式(if 周围缺少括号):

"select * from xx" + (if(order.isDefined) {" order by " + order.get} else {""})

【讨论】:

  • 非常感谢,Tomasz,我刚刚在 google 上找到了它...是的,我正在尝试学习使用 Scala 最惯用的方式...
【解决方案2】:

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

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

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

【讨论】:

  • 如果你要折叠,为什么不使用前缀作为初始值,一次完成整个操作呢? val sql = order.foldLeft("select * from xx")((_,b)=>" order by " + b)
  • @AndrzejDoyle 你是对的,这是一种方法......我想这是一个更大的动态构造查询的一部分,你有一个只构建“order by”的函数部分,另一个构建“where”子句并将它们放在最后
猜你喜欢
  • 2012-04-16
  • 2015-02-03
  • 2011-10-24
  • 2021-08-14
  • 2011-07-11
  • 1970-01-01
  • 2017-03-31
  • 2016-08-09
  • 2015-05-20
相关资源
最近更新 更多