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