是否可以更改val
字段的值?
如果是这样,那只是通过构造函数而不是程序中的任何地方完成的吗?
使用val
意味着永远不能修改内存位置?
例如:
val x = 5
我可以再次使用x
指向具有不同值的其他位置吗?
答案 0 :(得分:8)
简而言之:不,你不能。 这是不变性,确保您始终确保该值保持不变。
这就是为什么有一个不可变的[ vals ]和mutables [ vars ]的选项,它的灵活性和允许你选择取决于您的需求。选择你的选择并遵守其规则。
答案 1 :(得分:3)
val是不可变的。 如果你想改变这个值,你应该改用var。
答案 2 :(得分:3)
如果您希望字段可变,则应将其声明为var
而不是val
。如果由于某种原因您无法将val
更改为var
并仍需要更改其值,则可以使用反射执行此操作。
class ModifyVal {
val x = 5
}
object ModifyVal {
def main(args: Array[String]): Unit = {
val instance = new ModifyVal()
println(instance.x) // 5
// instance.x = 10 doesn't compile: Reassignment to val
val fieldX = instance.getClass.getDeclaredField("x")
fieldX.setAccessible(true)
fieldX.setInt(instance, 10)
println(instance.x) // 10
}
}
答案 3 :(得分:2)
作为一般规则(不采用扭曲语言意图的扭曲),不能修改val
,也不应该修改。{1}}。相反,如果您希望保持编程的功能样式,请考虑使用val
字段的修改值制作包含实例的副本。案例类已经通过提供copy
构造函数来启用这种操作来帮助解决这个问题:
case class Person(name: String, age: Int) {
def birthday = copy(age = age + 1) // returns a new Person with the same name, but one year older
}
答案 4 :(得分:2)
val ,粗略地说,意味着 常量 (Java中的 final ) 。
声明时,必须将 val 分配给某个值,值为
val name: String // compilation error
val name : String = "Hello"
或者没有(虽然没有人这样做)
val name : String = _
分配val后,无法重新分配。
不变性是Scala强烈支持的一个有用特性。这鼓励编写没有副作用和线程安全的代码。这就是Scala是可扩展和并发应用程序的不错选择。
Scala中的一种特殊的不变性就是未来。 Future是一次性写入容器 - 在未来完成之后,它实际上是不可变的。