Ruby - 通过值或引用传递

时间:2015-03-28 15:53:53

标签: ruby

我搜索过这个,每个人似乎都说Ruby总是按值传递,但是这个简单的小例子是一个更大的程序的子集,我有点困惑。

a = "J123"
b = a
a.slice!(0)
puts a
puts b

显示

123
123

我不明白为什么“b”的价值正在改变。

2 个答案:

答案 0 :(得分:2)

因为ab都是指向同一对象的指针。它们不是对象本身。你只能在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也是值传递),关于如何测试一种语言是否真正支持传递引用。