开发者

Why can't I modify values of an array in a method?

In the code fragment below, the array deck should equal [6,9,5,6,5,1,2] since Ruby passes arrays by reference. After the method call, the values of deck does not change. Why is that?

def count_cut!(deck)
开发者_如何学JAVA  s1, s2 = deck[0, deck.last], deck[deck.last..-2]
  deck = s2 + s1 + [deck.last]
end

deck = [5, 1, 6, 9, 5, 6, 2]
count_cut!(deck)
p deck

I am using Ruby 1.9.2-p180.


Assigning to deck does not mutate the array that was passed in. It is treated like a local variable in the scope of the function definition. You can call deck.replace if you really want to mutate it.


Do it the Ruby way: Instead of modifying the original array, return the modified array:

def count_cut(deck)
  s1, s2 = deck[0, deck.last], deck[deck.last..-2]
  s2 + s1 + [deck.last]
end

The caller then assigns the return value to deck:

deck = [5, 1, 6, 9, 5, 6, 2]
deck = count_cut(deck)
p deck

But consider encapsulating it all in a Deck class, especially if a deck has other behaviors:

class Deck

  def initialize(cards)
    @cards = cards
  end

  def count_cut!
    s1, s2 = @cards[0, @cards.last], @cards[@cards.last..-2]
    @cards = s2 + s1 + [@cards.last]
  end

end

deck = Deck.new [5, 1, 6, 9, 5, 6, 2]
deck.count_cut!
p deck


The .+ method of Array gets you a new Array. Use .unshift to modify the original object.

deck = [1,2,3,4,5]
p deck.object_id #some_number
deck = [6] + deck
p deck.object_id #another_number
deck.unshift([7])
p deck.object_id #unchanged 


You're not modifying the array that the deck variable references, you're just assigning a new array to the local variable deck:

deck = s2 + s1 + [deck.last]

The above creates a new array whose contents are s2 + s1 + [deck.last], this new array is then assigned to the local variable deck. The array that deck originally referenced is left unchanged. If you want to change the array, then you'd need something like this:

deck_last = deck.last
deck.clear
deck.push(*s2)
deck.push(*s1)
deck.push(deck_last)

or you'd lose the connection between the local variable deck and the non-local array that it references.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜