如果這是重復的,我很抱歉 - 我在現有帖子中找不到任何類似的內容。
我理解像shuffle和 之類的方法之間的區別shuffle!。但是,我很困惑為什么多次呼叫該方法會導致更改先前參考它的所有物件的變數?我希望一旦我們應用了一個方法,變數就會得到一個值,我們就完成了。并不是說它繼續參考方法呼叫和傳遞的引數,并且稍后會重新評估。
我認為最好用一個例子來演示:
irb(main):001:1* def shuffle(arr)
irb(main):002:1* arr.shuffle!
irb(main):003:0> end
=> :shuffle
irb(main):004:0> arr = [1,2,3,4]
=> [1, 2, 3, 4]
irb(main):005:0> one = shuffle(arr)
=> [4, 2, 3, 1]
irb(main):006:0> two = shuffle(arr)
=> [1, 2, 4, 3]
irb(main):007:0> one
=> [1, 2, 4, 3]
所以,我希望one留在這里[4, 2, 3, 1]。但是,對于每個新呼叫,所有以前的呼叫都將等同于方法呼叫的最新結果。我意識到它應該與使用相同的引數呼叫它有關arr,但仍然不太有意義。
在此先感謝您的貢獻。
uj5u.com熱心網友回復:
Array#shuffle! 原地打亂陣列并回傳其接收器:
ary = [1, 2, 3, 4]
ary.equal?(ary.shuffle!) #=> true
將結果分配shuffle!給另一個變數不會改變這一點。它只會導致參考同一個陣列的兩個變數:
a = [1, 2, 3, 4]
b = a.shuffle!
a #=> [2, 4, 1, 3]
b #=> [2, 4, 1, 3]
a.equal?(b) #=> true
您可能想要一個新陣列。這就是Array#shuffle(沒有!)的用途:
a = [1, 2, 3, 4]
b = a.shuffle
a #=> [1, 2, 3, 4]
b #=> [2, 4, 1, 3]
即使shuffle按原始順序回傳元素,您也會得到另一個陣列實體:
a = [1, 2, 3, 4]
b = a.shuffle until b == a
a #=> [1, 2, 3, 4]
b #=> [1, 2, 3, 4]
a.equal?(b) #=> false
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/404414.html
標籤:
