以下面的代码为例,
var a = new StringBuffer("Foo!")
val b = a
a = null
println(b)
我预计 b 的值会变为 null ,但它没有。与分配引用的Java不同,此处 a 已复制到 b 。我们如何在Scala中分配引用而不是仅仅复制值?
答案 0 :(得分:4)
你不能在Scala中这样做。而BTW的工作方式与Java中的完全相同:
public class Test {
public static void main(String... args) {
StringBuffer a = new StringBuffer("Foo!");
StringBuffer b = a;
a = null;
System.out.println(b);
// Foo!
}
}
还有Python,我可能会添加,查看您的用户名:
a = ['Foo!']
b = a
a = None
b
# >>> ['Foo!']
答案 1 :(得分:1)
这是所有理智语言中的预期行为。可以想象所有的变量和值都是指针,事实上,它们都是指针,它们是(原始类型除外)。
这只是伪代码,具有类似c的指针语义
StringBuffer* a = new StringBuffer("Foo!")
StringBuffer* b = a
a = null
println(b)
毕竟,b
仍然指向您在第一行中创建的对象。