如何更改不可变对象的值

时间:2019-02-20 07:48:59

标签: scala closures immutability

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

如果我打电话给multiplier(3),它将为我们提供输出9

我想要的是

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

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

2 个答案:

答案 0 :(得分:2)

您不能更改不可变对象的值。这就是字面意思,英语单词“ immutable”的意思是:不变。函数式编程的全部要点是,您从不更改对象,而仅返回新对象。

答案 1 :(得分:-1)

不知道这是否是个好主意

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。无法看到您还能怎么做而又不会变得复杂。