在Ruby中,幾乎每一個對象是按引用傳遞。這意味着,當你做的
a = b
簡單的東西,除非是簡單的類型之一,這種分配a
後b
將指向同樣的事情。
這意味着,如果你改變第二個變量,第一個受到影響的相同方式:
irb(main):001:0> x = "a string"
=> "a string"
irb(main):002:0> y = x
=> "a string"
irb(main):003:0> x[1,0] = "nother"
=> "nother"
irb(main):004:0> x
=> "another string"
irb(main):005:0> y
=> "another string"
irb(main):006:0>
,當然同樣適用於哈希:
irb(main):006:0> a = { :a => 1 }
=> {:a=>1}
irb(main):007:0> b = a
=> {:a=>1}
irb(main):008:0> a[:b] = 2
=> 2
irb(main):009:0> a
=> {:a=>1, :b=>2}
irb(main):010:0> b
=> {:a=>1, :b=>2}
irb(main):011:0>
如果你不想這種情況發生,使用.dup
或.clone
:
irb(main):001:0> a = "a string"
=> "a string"
irb(main):002:0> b = a.dup
=> "a string"
irb(main):003:0> a[1,0] = "nother"
=> "nother"
irb(main):004:0> a
=> "another string"
irb(main):005:0> b
=> "a string"
irb(main):006:0>
莫st人dup
和clone
具有相同的效果。
所以,如果你寫被修改的修改其參數之一,除非你特別想通過調用該函數的代碼可以看出這些變化,你應該先DUP參數的函數:
def test_111(hash)
hash = hash.dup
# etc
end
您的代碼的行爲稱爲副作用 - 程序狀態的更改不是該函數的核心部分。副作用通常要避免。
JörgW Mittag認爲Ruby是通過價值傳遞的。 http://stackoverflow.com/a/6528257/38765 – 2012-04-22 23:25:56
他也承認通過的值可以是指針。從糟糕的編碼者的角度來看,這是參考:) – 2012-04-23 00:12:04