Scala相当于C#中的`??`运算符

use*_*445 7 c# scala

可能重复:
如何在scala中编写正确的null安全合并运算符?

??C#中的运算符的Scala等价物是什么?

例:

string result = value1 ?? value2 ?? value3 ?? String.Empty;
Run Code Online (Sandbox Code Playgroud)

Rex*_*err 10

您可以使用相同的语义编写自己的语义 - 这是由于从左到右评估而始终坚持相同类型的语义,但是可以将其更改为?:从右到左的评估,根据需要扩展类型:

class CoalesceNull[A <: AnyRef](a: A) { def ??(b: A) = if (a==null) b else a }
implicit def coalesce_anything[A <: AnyRef](a: A) = new CoalesceNull(a)

scala> (null:String) ?? (null:String) ?? "(default value)"
res0: String = (default value)
Run Code Online (Sandbox Code Playgroud)

但是这个运算符不存在的原因可能是Option处理这种情况的首选方式以及处理不存在的值的许多类似情况:

scala> List((null:String),(null:String),"(default value)").flatMap(Option(_)).headOption
res72: Option[java.lang.String] = Some((default value))
Run Code Online (Sandbox Code Playgroud)

(如果你是确保至少有一个是不为空,你可以只使用head;请注意,这样做是因为Option(null)皈依NoneflatMap收集只有一起Some(_)条目.)

  • 我认为它应该是`def ??(b:=> A)`以使语义相同.我认为除非`a`为'null`,否则不应评估elvis运算符的右侧.可能是错的. (2认同)

And*_*day 5

试试 getOrElse。我朋友建议。

  • 不是一个合适的运算符,但对于简单的表达式可能很方便:`Option(null:String).getOrElse("default value")` 或 `Option(Option(null:String).getOrElse(null:String)).getOrElse("默认值")` (2认同)

SwD*_*n81 2

我不相信有这样一个。您可以查看这篇文章,了解空合并运算符的实现。