Scala相当于PHP的isset()

use*_*853 0 scala playframework

如何测试并查看是否在Scala中设置了变量.在PHP中你会使用isset()

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

Tom*_*icz 6

PHP和Scala是如此不同,没有直接的等价物.首先,Scala提升了不可变变量(final在Java世界中),因此通常我们会努力寻找始终设置的变量.

你可以检查null:

var person: Person = null
//...
if(person == null) {//not set
  //...
}
person = new Person()
if(person == null) {//set
  //...
}
Run Code Online (Sandbox Code Playgroud)

但这是一种糟糕的做法.最常用的方法是使用Option:

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

再次,使用isDefined不是最习惯的方式.考虑map和模式匹配.


Dan*_*ral 6

首先,Array在Scala中没有密钥.他们有指数,所有指数都有价值.但请参阅下面的编辑,了解如何初始化这些值.

你可能意味着Map,它有钥匙.可以通过使用检查密钥是否存在(并且,因此,一个值)isDefinedAtcontains:

map isDefinedAt key
map contains key
Run Code Online (Sandbox Code Playgroud)

两者之间没有实际区别.现在,您在编辑中看到Scala喜欢使用Option,并且在处理地图时只有这样的方法.如果你这样做:

map get key
Run Code Online (Sandbox Code Playgroud)

如果密钥(因此,值)不存在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.这意味着你不会设置东西,而是生成一个新的东西副本,并将该值设置为其他东西.