不可变变量和变量变量有什么区别?

时间:2017-02-23 11:11:38

标签: immutability

我已经阅读了互联网上几乎所有不可变/可变变量的定义,但作为一个初学者,我只是没有完全掌握它,所以我想知道是否有人可以用外行术语来解释它。

任何编程语言中的不可变变量(或对象)都是我理解的,当您在赋值后不能更改该变量的值时。例如,我正在使用Haskell编程语言,我写道:

let x = 5

由于Haskell具有不可变变量,因此x永远不会具有除5之外的任何其他值。因此,如果我在该行代码之后写入:

x = 2

我实际上没有更改x的值但是创建了一个具有相同名称的新变量,现在它将是我调用x时引用的变量,因此在两行代码后我只能到达x值2。

但那么什么是可变变量,以及编程语言有哪些呢?这是我迷雾的地方。因为当人们说变量变量时,他们显然是指一个变量或对象,你可以确定的值在被赋予初始值后确实会发生变化。

这是否意味着如果你有一个可变变量,你实际操作该变量的计算机内存中的那个位置,并且在不可变变量的情况下,你无法操纵计算机内存中的那个位置或者什么?

我不知道如何进一步解释我的问题,正如我所说,我明白mutable =可以在初始值赋值后改变变量值,immutable =不能。我明白了。但我不明白它在“幕后”发生的事情上究竟意味着什么。我想我正在寻找关于实际可变变量的简单示例。

1 个答案:

答案 0 :(得分:0)

这与不变性无关

let x = 5
x = 2

这是重新分配,绝对不允许在Haskell中

首先让我们看看常规let作业

Prelude> let x = 5 in x
5
it :: Num a => a

您可以使用x绑定let,并在嵌套x中重新绑定 let - 这有效阴影< / em>外x

Prelude> let x = 5 in let x = 2 in x
2
it :: Num a => a

记住let基本上是一个lambda

Prelude> (\x -> x) 5
5
it :: Num a => a

当然,一个lambda可以返回lambda;说明影子agian

Prelude> (\x -> (\x -> x)) 5 2
2
it :: Num a => a