标题说明了问题,这是一个代码示例:
def foo(): String = {
var result: String = new String()
result
}
def bar(): String = {
val result = new String()
result
}
var vs. val仅对方法范围内的变量有影响吗?还是返回类型隐式地保持不变性/可变性状态?例如。 bar()的返回类型仍然不可变?
原谅我的无知,我是scala的新手。
答案 0 :(得分:6)
两个方法的返回类型均为String。无论返回的值是来自val还是var都不相关,它们都返回String。 val或var在本地范围内,不是被关闭的东西,一旦方法调用结束,它便不再存在。 Scala的目标之一是拥有强类型,因此您可以将函数链接在一起,并确信如果它可以编译,它实际上可以工作;如果方法的内部实现影响了您必须如何对待其返回值,那么一切都会崩溃。
对象本身是否可变取决于对象的实现方式,而不取决于对象的引用方式。字符串是不可变的,因为它的设计者确保没有办法修改其内部状态。 var仅表示该变量允许将引用替换为另一个引用。
关于不变性或引用的Java语言讨论也适用于Scala。
答案 1 :(得分:4)
简而言之,var
和val
分别标记了在给定范围内重新分配名称的能力。
val
表示在此范围内对该对象的引用不能更改;不过,底层的 object 可能会发生变化。 var
表示此范围中被引用的对象可以更改,因此可以重新分配。
基本上,如果离开函数范围的对象是可变对象,则无论var
还是val
,都可以对其进行突变。
请参见以下示例:
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer
scala> def foo(): ArrayBuffer[Int] = {
| val buff = new ArrayBuffer[Int]()
| buff
| }
foo: ()scala.collection.mutable.ArrayBuffer[Int]
scala> def bar(): ArrayBuffer[Int] = {
| var buff = new ArrayBuffer[Int]()
| buff
| }
bar: ()scala.collection.mutable.ArrayBuffer[Int]
scala> val fooBuff = foo()
fooBuff: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()
scala> fooBuff.append(1)
scala> val barBuff = bar()
barBuff: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()
scala> barBuff.append(1)
scala> println(fooBuff); println(barBuff)
ArrayBuffer(1)
ArrayBuffer(1)
但是,如果基础对象不是可变对象,则在范围之外也不会可变。
有关更多信息,请参见this post。