Possible Duplicate:
Why Option[T]?可选的引用类型
引用类型提供特殊值null
意思是“不存在的值”。值类型没有这样的值,这就是为什么C#引入可选值类型(以及它们的特殊语法)。
斯卡拉的Option[T]
有三个不同的“空”值:null
,None
和Some(null)
。究竟是什么增加了复杂性在安全性和可表达性方面购买我们?我什么时候可以用它?
Possible Duplicate:
Why Option[T]?可选的引用类型
引用类型提供特殊值null
意思是“不存在的值”。值类型没有这样的值,这就是为什么C#引入可选值类型(以及它们的特殊语法)。
斯卡拉的Option[T]
有三个不同的“空”值:null
,None
和Some(null)
。究竟是什么增加了复杂性在安全性和可表达性方面购买我们?我什么时候可以用它?
斯卡拉真的只有一个空值:None
。请勿使用null
(与现有Java代码的向后兼容性除外)。
关于为什么Option[T]
有用,SO上有很多答案。例如:请参阅this。
简短版本:
它使可选自然是一个签名显式。下面明确指出,我们预计t
可能是“空”:
def f(t: Option[T])
您没有操作前为null检查:(i: Option[Int]) => i.map(_ + 1)
工作正常i
是Some(5)
或None
,和保留Option
包装来表明输入可能是None
(因此输出也可能是None
)。
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
我知道这是三年后你发布你的答案,但仅供参考,我在Scala 2.11.4中得到以下内容REPL:
fixed;它现在编译。 – dhg 2014-12-13 19:35:59
在C#(和一般的.NET Framework中)存在的类型Nullable<T>
,这是一种包装的:
def f(i: Option[Int]) = i.map(_ + 1)
f(Some(5)) // Some(6)
f(None) // None
您可以与其他Option
S或集合容易撰写他们对于价值类型。
Nullable<int> i = null;
if (i == null) ...
if (i.HasValue) { int k = i.Value; ... }
没有为Nullable<T>
快捷方式:T?
。
int? i = null;
在另一方面,也有可选参数。您必须定义这些的默认值。没有办法知道他们是否失踪。
_“这就是为什么C#引入可选值类型”_这不是原因。 – gdoron 2012-03-17 23:18:30
这是为什么'Option'优于'null'的最好解释之一:[为什么Scala的“Option”和Haskell的“Maybe”类型可以让你免于null](http://james-iry.blogspot.com /2010/08/why-scalas-and-haskells-types-will-save.html) – Jesper 2012-03-18 10:19:19