更改val字段的值

时间:2015-09-05 17:39:48

标签: scala immutability

是否可以更改val字段的值? 如果是这样,那只是通过构造函数而不是程序中的任何地方完成的吗? 使用val意味着永远不能修改内存位置? 例如: val x = 5 我可以再次使用x指向具有不同值的其他位置吗?

5 个答案:

答案 0 :(得分:8)

简而言之:不,你不能这是不变性,确保您始终确保该值保持不变。

这就是为什么有一个不可变的[ vals ]和mutables [ vars ]的选项,它的灵活性和允许你选择取决于您的需求。选择你的选择并遵守其规则。

答案 1 :(得分:3)

val是不可变的。 如果你想改变这个值,你应该改用var。

Difference between val and var scala

答案 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是一次性写入容器 - 在未来完成之后,它实际上是不可变的。