2012-06-26 68 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。这意味着你不会设置任何东西,而是生成一个新值,并将该值设置为其他值。