How to swap array elements using parallel assignment?

I am trying to swap two elements in an array like this

deck = [] (deck << (1..52).to_a << 'A' << 'B').flatten! p deck deck[deck.index("A")], deck[deck.index("B")] = deck[deck.index("B")], deck[deck.index("A")] #swap "A" and "B" p deck 

But he does not change places. If I do this, however:

 deck[52], deck[53] = deck[53], deck[52] 

it works. Any suggestions?

0
source share
1 answer

To make things simple, let the deck be just ['A', 'B']. Here is a step-by-step evaluation:

 deck = ['A', 'B'] deck[deck.index("A")], deck[deck.index("B")] = deck[deck.index("B")], deck[deck.index("A")] # deck == ['A', 'B'] deck[deck.index("A")], deck[deck.index("B")] = deck[1], deck[0] # deck == ['A', 'B'] deck[deck.index("A")], deck[deck.index("B")] = 'B', 'A' # deck == ['A', 'B'] deck[0], deck[deck.index("B")] = 'B', 'A' # deck == ['A', 'B'] # Applying first assignment. ..., deck[deck.index("B")] = ..., 'A' # deck == ['B', 'B'] # NOTE: deck.index("B") is 0 now, not 1! ..., deck[0] = ..., 'A' # deck == ['B', 'B'] # Applying second assignment. ... # deck == ['A', 'B'] 

What your code actually does is simply bind the tweets to the same element of the array.

To fix this problem, just store the deck.index () values ​​in a temporary array:

 deck = [] (deck << (1..52).to_a << 'A' << 'B').flatten! p deck index_a, index_b = deck.index("A"), deck.index("B") deck[index_a], deck[index_b] = deck[index_b], deck[index_a] p deck 
+2
source

All Articles