可选的引用类型

fre*_*low 2 c# null scala nullable option

可能重复:
为什么选项[T]?

引用类型提供特殊值,null表示"缺少值".值类型没有这样的值,这就是C#引入可选值类型(以及它们的特殊语法)的原因.

Scala的Option[T]有三种不同的"空"值:null,NoneSome(null).在安全性和可表达性方面,这增加了多少复杂性给我们带来了什么?我什么时候使用哪个?

dhg*_*dhg 5

好的Scala实际上只有一个空值:None.不要使用null(除了与现有Java代码的向后兼容性).

关于为什么Option[T]有用,有很多答案.例如:看到这个.

简短版本:

它使可选性质成为明确的签名.以下明确指出我们预计t可能是"空":

def f(t: Option[T]) 
Run Code Online (Sandbox Code Playgroud)

你不必操作前为null检查:(i: Option[Int]) => i.map(_ + 1)正常工作是否iSome(5)None,保留Option包装,以表明输入可能已经None(和,因此,输出可能是None也).

def f(i: Option[Int]) = i.map(_ + 1)
f(Some(5)) // Some(6)
f(None)    // None
Run Code Online (Sandbox Code Playgroud)

您可以使用其他Options或集合轻松编写它们:

val a: Option[Int] = Some(1)
val b: Option[Int] = Some(6)
val c: Option[Int] = Some(5)
val d: Option[Int] = None
for(x <- a; y <- b; z <- c) yield x + y + z // Some(12)
for(x <- a; y <- d; z <- c) yield x + y + z // None
Run Code Online (Sandbox Code Playgroud)