不可变标签与 val 对方法的返回类型有什么影响吗?



标题解释了这个问题,下面是一个代码示例:

def foo(): String = {
var result: String = new String()
result
}
def bar(): String = {
val result = new String()
result
}

var 与 val 是否仅对方法范围内的变量有影响?还是返回类型隐式维护了不变性/可变性状态?例如,来自 bar(( 的返回类型是否仍然不可变?

请原谅我的无知,我对 scala 完全陌生。

这两个方法的返回类型都是字符串。返回的值是来自 val 还是 var 无关紧要,它们都返回一个字符串。 val 或 var 在本地范围内,它不是被关闭的东西,一旦方法调用结束,它就不复存在了。Scala 的目标之一是具有强类型,因此您可以将函数链接在一起,并确信如果它编译它实际上可能会工作;如果一个方法的内部实现影响了你必须如何处理它的返回值,那么这一切都会分崩离析。

对象本身是否可变取决于对象的实现方式,而不是引用对象的方式。字符串是不可变的,因为它的设计者确保无法修改其内部状态。var 仅表示变量允许将引用换出另一个引用。

关于不变性或引用是什么的Java语言讨论也适用于Scala。

简而言之,varval分别标记在给定范围内重新分配给名称的能力和不能力。

val表示在此作用域中对对象的引用不能更改;但是,基础对象可能会更改。var表示在此作用域中引用的对象可以更改,因此可以重新分配它。

基本上,如果离开函数范围的对象是可变对象,则无论varval都可以对其进行更改。

请参阅以下示例:

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)

但是,如果基础对象不是可变对象,则在范围之外它不会可变。

有关更多信息,请参阅此帖子。

最新更新