如何更改不可变对象的值

How to change value of immutable object

提问人:Shubham Goyal 提问时间:2/20/2019 最后编辑:MatShubham Goyal 更新时间:2/20/2019 访问量:757

问:

val factor = 3
val multiplier = (i:Int) => i * factor

如果我调用它将给我们一个输出.multiplier(3)9

我想要的是

multiplier(3)
output =9
multiplier(3)
output=6

如何更改此类功能的乘数,因为因子是不可变的?

Scala 闭包 不可变性

评论

1赞 codeomnitrix 2/20/2019
您不能修改因子,因为它声明为 val。我不确定你到底想要什么,但为什么不是 i*(factor-1) ?
1赞 jwvh 2/20/2019
参考透明度。这在FP圈子里是一个相当重要的概念。
2赞 Tim 2/20/2019
你能更详细地介绍一下你想如何工作吗?为什么第一次和第二次都会返回?第三次应该会发生什么?multiplier*3*2
1赞 Pavel 2/20/2019
我真的怀疑你不必改变任何东西,可能的方法是使用咖喱......docs.scala-lang.org/tour/currying.html

答:

3赞 Jörg W Mittag 2/20/2019 #1

不能更改不可变对象的值。这就是英语单词“immutable”的字面意思:不可改变。函数式编程的全部意义在于,你永远不会改变对象,你只返回新的对象。

-1赞 joel 2/20/2019 #2

不知道这是否是一个好主意

val factor = 3

// all this Wrap stuff is so that we don't have an implicit Int
class Wrap(var inner: Int)
implicit val tmp = new Wrap(factor + 1)
def multiplier(i: Int)(implicit w: Wrap) = { w.inner -= 1; w.inner * i }

如果需要,可以替代其他功能。或者没有隐含w.inner -= 1

class Wrap(var inner: Int)
var tmp = new Wrap(factor + 1)

def base(i: Int)(w: Wrap) = { w.inner -= 1; i * w.inner }
def multiplier(i: Int) = base(i)(tmp)

两者都做

multiplier(3)  // 9
multiplier(3)  // 6
multiplier(3)  // 3

这两种方式都需要创建一个 var。看不出你还能在不变得复杂的情况下做到这一点。

评论

1赞 joel 2/20/2019
我很想知道其中的哪一部分得到了反对票以及为什么