0

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

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

4

2 回答 2

6

PHP 和 Scala 是如此不同,以至于没有直接的等价物。首先,Scala 提倡不可变变量(final在 Java 世界中),因此我们通常会争取始终设置的变量。

您可以检查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和模式匹配。

于 2012-06-26T17:19:34.470 回答
6

首先,Array在 Scala 中没有键。它们有索引,并且所有索引都有值。不过,请参阅下面有关如何初始化这些值的编辑。

您可能的意思是Map, 其中有键。isDefinedAt您可以使用or来检查键是否存在(因此是值)contains

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. 请参阅有关各种使用方式的其他 Stack Overflow 问题Option,因为您也不会像variable.isDefined在惯用代码中那样使用它(尽管它有效)。

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

于 2012-06-26T17:36:07.820 回答