Scala-val和var相关的问题和Scala要求我在声明时赋值



我有一个变量,我想声明如下:

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检索此值。

最新更新