我有一个变量,我想声明如下:
val foo : Baz
for (s <- barList) {
if s.tag == "java"
foo = s
}
一旦为foo
分配了值,就不能重新分配foo
。从这个角度来看,foo
的类型是val,而不是var。但上面不是有效的scala代码,因为scala强制在声明时赋值。即使我使用var,scala也会强制我赋值。有更好的解决方案吗?我之所以喜欢val,是因为它能带来更好的性能,而且val语义适合上述场景。
我会这样做:
val foo: Baz = barList.find(_.tag == "java").getOrElse( /* provide default here */)
问题是,您是从C的角度来看待这个问题的——一个变量,无论是否可变,都只是一个可以放置一些值的内存地址。
然而,在函数式语言中,变量(或多或少(是一个类似于命名表达式的变量。你声明:从现在开始,左边的东西应该被视为右边的东西。仅仅声明变量就是试图给虚无赋予一个名称。
但是,如果你不关心这些事情,你可以使用var
来存储值,更新它或任何你需要的东西,然后将它重新分配给val
。或者只是修改并使用MageeS的解决方案。
怎么样
val foo = barList.find(_.tag == "java")
您可以使用_
将默认值传递给var
(对于val
来说,这是非常无用的(:
var foo : Baz = _
for (s <- barList) {
if s.tag == "java"
foo = s
}
然而,对于这个特定的例子,MageeS的解决方案更好。如果可能,请避免声明var
。
编辑:回应Jean Phillipe的评论。在函数体内部时,如果不能指定合理的默认值。您应该使用Option
。代码变为:
var foo : Option[Baz] = None
for (s <- barList) {
if s.tag == "java"
foo = Some( s )
}
循环之后,如果没有找到任何内容,foo
将仍然等于None
,或者等于Some(...)
,其中点替换barList
中标记为"java"的最后一个元素。您可以使用foo.get
检索此值。