gpt4 book ai didi

clojure - 在 Clojure 中,值类型和引用类型之间有有意义的区别吗?

转载 作者:行者123 更新时间:2023-12-03 07:56:14 26 4
gpt4 key购买 nike

我开始意识到,如果值类型和引用类型都是不可变的,那么它们之间几乎没有什么区别。为了测试这一点,我想看看像 Clojure 这样真正热爱不变性的人是如何处理它的。不幸的是,我是一个无知的 C# 程序员,既不会 Java 也不会 Clojure,所以我的 Google 没有帮助。

在 C# 中,值类型和引用类型是有区别的。这只是经典的“按值传递”和“按引用传递”的区别。 Clojure 中是否存在类似的区别?我确信 Java 中也是如此,尽管术语可能不一样。如果它确实存在于 Clojure 中,它的存在是否只是因为它直接继承自 Java(例如通过导入 Java 库?)?

最佳答案

即使在 Java 中,这种区别实际上也不存在。有时,考虑通过引用传递对象是很方便的,因为我可以将对象传递给方法,该方法可以改变该对象,并且我可以在父方法中看到该改变。但实际上,我们只是通过值向该方法传递了一个指向对象的指针,并且它取消引用该指针来修改它。

这看起来像是吹毛求疵:隐式指针和引用不一样吗?不能,因为我们调用的方法无法为我们重新分配指针,就像 C# 可以使用 ref 参数一样。例如,如果我有一个不可变类型:

final class IntPair {
final int x;
final int y;
IntPair(int x, int y) { this.x = x; this.y = y; }
}

并且我将这样的 IntPair 传递给方法,我知道它的 x 和 y 字段将保持不变。该类型没有提供改变自身的方法,该语言也没有提供用另一个对象替换该对象的方法。

Clojure 继承了所有这些语义。

关于clojure - 在 Clojure 中,值类型和引用类型之间有有意义的区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75989944/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com