2012-06-26 100 views

回答

6

PHP和Scala是如此不同以至於沒有直接的等價物。首先,Scala提倡不變的變量(Java世界中的final),所以通常我們會爭取始終設置的變量。

您可以檢查null

var person: Person = null 
//... 
if(person == null) {//not set 
    //... 
} 
person = new Person() 
if(person == null) {//set 
    //... 
} 

但它是一個貧窮的做法。最習慣的方法是使用Option

var person: Option[Person] = None 
//... 
if(person.isDefined) {//not set 
    //... 
} 
person = Some(new Person()) 
if(person.isDefined) {//set 
    //... 
} 

同樣,使用isDefined不是最慣用的方式。考慮map和模式匹配。

+0

我該如何做「地圖」和模式匹配? – user1435853

+0

@ user1435853:參見http://www.scala-lang.org/api/current/scala/Option.html和http://dibblego.wordpress.com/2008/01/16/scalaoption-cheat-sheet/ –

+0

該類型將寫入'Option [Person]'(方括號),而不是'Option(Person)'。 – Madoc

6

首先,在斯卡拉Array沒有鑰匙。他們有指數,所有指數都有價值。不過,請參閱下面的編輯,瞭解這些值如何初始化。

你可能是指Map,它有鍵。您可以通過使用isDefinedAtcontains檢查按鍵是否存在(和,因此,一個值):

map isDefinedAt key 
map contains key 

有兩個之間沒有實際區別。現在,您在編輯中看到Scala傾向於使用Option,並且在處理地圖時只有這樣一種方法。如果你這樣做:

map get key 

,您會收到Option回來了,這將是None如果密鑰(因此,值)不存在。

編輯

這是原來的答案。我現在已經注意到這個問題並不完全是這個問題。實際上,JVM上的所有字段都是由JVM本身預先初始化的,這將它歸零。在實踐中,所有參考字段最終指向null,布爾值被初始化爲false,並且所有其他基元都以它們的零版本進行初始化。

Scala中沒有這樣的事物作爲「未定義」字段 - 你甚至不能寫這樣的東西。您可以編寫var x: Type = _,但這隻會導致JVM初始化值。您可以使用null來代表未初始化的地方,但它的慣用Scala代碼試圖避免這樣做。

指示值不存在的可能性的常用方法是使用Option。如果你有一個價值,那麼你得到Some(value)。如果你不這樣做,你會得到None。查看其他堆棧溢出問題,關於使用Option的各種方法,因爲您在慣用代碼中沒有像variable.isDefined那樣使用它(雖然這很有效)。

最後,請注意,慣用的Scala代碼不會使用var多,寧願使用val。這意味着你不會設置任何東西,而是生成一個新值,並將該值設置爲其他值。