Scala相当于PHP的isset()

时间:2012-06-26 17:14:24

标签: scala playframework

如何测试并查看Scala中是否设置了变量。在PHP中,您将使用isset()

我正在寻找一种方法来查看是否在数组中设置了一个键。

2 个答案:

答案 0 :(得分: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和模式匹配。

答案 1 :(得分:6)

首先,Scala中的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的各种方法的其他Stack Overflow问题,因为您不会在惯用代码中使用variable.isDefined(尽管可行)。

最后,请注意,惯用的Scala代码不会使用var,更喜欢使用val。这意味着你不会设置东西,而是生成一个新的东西副本,并将该值设置为其他东西。