如何测试并查看Scala中是否设置了变量。在PHP中,您将使用isset()
我正在寻找一种方法来查看是否在数组中设置了一个键。
答案 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
,它有钥匙。您可以使用isDefinedAt
或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
。请参阅有关使用Option
的各种方法的其他Stack Overflow问题,因为您不会在惯用代码中使用variable.isDefined
(尽管可行)。
最后,请注意,惯用的Scala代码不会使用var
,更喜欢使用val
。这意味着你不会设置东西,而是生成一个新的东西副本,并将该值设置为其他东西。