如何更改不可变对象的值

Posted

技术标签:

【中文标题】如何更改不可变对象的值【英文标题】:How to change value of immutable object 【发布时间】:2019-07-13 20:14:55 【问题描述】:
val factor = 3
val multiplier = (i:Int) => i * factor

如果我打电话给multiplier(3),它会给我们一个输出9

我想要的是

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

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

【问题讨论】:

您不能修改因子,因为它声明为 val。我不确定你到底想要什么,但为什么不 i*(factor-1) ? Referential transparency。在 FP 圈子里是一个相当重要的概念。 您能否详细说明您希望multiplier 如何工作?为什么第一次返回*3,第二次返回*2?第三次应该怎么办? 我真的怀疑你不需要改变任何东西,可能的方法是使用柯里化 ..docs.scala-lang.org/tour/currying.html 【参考方案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。看不出还有什么方法可以做到不复杂。

【讨论】:

我很想知道其中的哪一部分被否决以及为什么【参考方案2】:

您无法更改不可变对象的值。这字面意思就是英文单词“immutable”的意思:不可改变。函数式编程的全部意义在于您从不更改对象,只返回新对象。

【讨论】:

以上是关于如何更改不可变对象的值的主要内容,如果未能解决你的问题,请参考以下文章

python基本数据类型

const修饰符在不同位置带来的效应

如何在java中从可变对象创建不可变对象? [复制]

Java中的mutable和immutable对象实例讲解

vue为啥method值不改

python—可变对象与不可变对象 参数传递