scala - 不变性设计(在 Scala 中)

标签 scala functional-programming immutability

随着 Scala 等编程语言对不变性的强调(避免“var”),这是否意味着我的对象中的“状态修改方法”必须返回实例的副本(具有新状态)?

让我们考虑乌龟。我想像这样移动我的乌龟:

val turtle = new Turtle(0, 0, "north")
val turtle2 = turtle.turnLeft().forward(5).turnRight().backward(2)

这里的turtle2 不会指向Turtle 的同一个实例(它们是两个独立的实例)。事实上,在这一系列 Action 中,创建了 4 个临时对象。这就是我将如何实现方法 turnLeft,例如:
def turnLeft {
  self.copy(orientation = self.orientation match {
    case "north" => "west"
    case "east" => "north"
    case "south" => "east"
    case "west" => "south"
  })
}

这是正确的设计方法吗?

如果是,那么效率/低效如何(在每次方法调用时创建新对象)?
如果不是,那什么是正确的?我对不变性方面(或者一般来说可能是函数式编程)的理解有什么错误/缺失?

提前致谢,
拉卡

最佳答案

创建大量的短期对象是 Scala 的一个标志性特征。它通常不会很昂贵,只要您在具有足够大小的堆的 JVM 上运行它,并有足够数量的年轻代内存来容纳所有的流失。

话虽如此,不变性不是一种宗教。常识应该占上风,并在坚持“范式”变得过于费力的情况下指导设计决策。

关于scala - 不变性设计(在 Scala 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27761429/

相关文章:

haskell - 结构化数据验证的依赖类型

java - 最终字段和不可变类

scala - 获取Scala的/理解表达式的已废止部分?

scala - 使用 Spark Scala 进行间隔合并

haskell - Haskell 中是否有任何终止折叠?

javascript - 在 JavaScript 中,是否可以更改对象初始值设定项的构造函数?

javascript - 使用动态键返回不可变状态

scala - 如何使用 JSR-223 在 sbt 控制台中获取 Scala 解释器?

scala - 如何通过scala中的类方法传递类型参数?

data-structures - 如何在函数式编程中实现内存有效的集合的无损操作?