Scala 对不可变数据的可变引用

Scala 对不可变数据的可变引用,scala,concurrency,functional-programming,immutability,mutable,Scala,Concurrency,Functional Programming,Immutability,Mutable,我经常听到术语“对不可变数据的可变引用”。就我而言,这是给Scala的。 如果您有一个可变的引用,这难道不意味着不可变的数据是可变的吗?我很难理解它的理论和实践方面。示例将非常好。这意味着您可以改变引用(更改引用内容),但不能改变数据(更改引用后面的内容)。只要存在对数据的多个引用,这种差异就很重要,在Scala这样的语言中,这种情况经常发生(赋值、参数传递、添加到集合等)。例如: var x = List(1); var y = x; x = List(2); // y.head == 1 /

我经常听到术语“对不可变数据的可变引用”。就我而言,这是给Scala的。
如果您有一个可变的引用,这难道不意味着不可变的数据是可变的吗?我很难理解它的理论和实践方面。示例将非常好。

这意味着您可以改变引用(更改引用内容),但不能改变数据(更改引用后面的内容)。只要存在对数据的多个引用,这种差异就很重要,在Scala这样的语言中,这种情况经常发生(赋值、参数传递、添加到集合等)。例如:

var x = List(1);
var y = x;
x = List(2);
// y.head == 1
// x.head == 2
请注意,这种区别甚至适用于Java:

String x = "foo";
String y = x;
x = "bar";
// y.equals("foo")
// x.equals("bar")

请注意,在这两个示例中,我们都对引用进行了变异
x
y
,但我们没有(事实上也不能)对它们引用的对象进行变异。

这意味着您可以变异引用(更改引用内容),但不能变异数据(更改引用后面的内容)。只要存在对数据的多个引用,这种差异就很重要,在Scala这样的语言中,这种情况经常发生(赋值、参数传递、添加到集合等)。例如:

var x = List(1);
var y = x;
x = List(2);
// y.head == 1
// x.head == 2
请注意,这种区别甚至适用于Java:

String x = "foo";
String y = x;
x = "bar";
// y.equals("foo")
// x.equals("bar")
请注意,在这两个示例中,我们都对引用
x
y
进行了变异,但我们没有(事实上无法)对它们引用的对象进行变异