我搜索过这个,每个人似乎都说Ruby总是按值传递,但是这个简单的小例子是一个更大的程序的子集,我有点困惑。
a = "J123"
b = a
a.slice!(0)
puts a
puts b
显示
123
123
我不明白为什么“b”的价值正在改变。
答案 0 :(得分:2)
因为a
和b
都是指向同一对象的指针。它们不是对象本身。你只能在Ruby中传递指针作为参数,并且指针按值传递。
这类似于Java,JavaScript和Python,与C ++,C#,Haskell和Scala不同。
以下示例中存在差异:
def f(y)
y = 2
end
x = 1
f(x)
puts x # 1, not 2
如果x
通过引用传递,则会打印2
。
答案 1 :(得分:0)
通过价值。红宝石中的一切都是一个对象。这意味着所有变量实际上都是内存中某个项目的引用(指针)。
x = 5 # (5 is stored as object in mem location 0x0001)
y = x # (now y also points to mem location 0x0001)
当您将变量传递给函数并按值复制该变量时,会复制内存位置地址,而不是该内存位置的实际对象。
在您的示例中,a和b的值(内存位置)都是按值复制的。但是它们指向相同的内存位置,因此通过一个变量修改内存中的位置仍会修改另一个变量的值。
修改强>
有一个great write-up here(对于Java也是值传递),关于如何测试一种语言是否真正支持传递引用。