Ruby 3.1 evaluates multiple assignments from left to right


Single assignment

In the case of single assignment, Ruby evaluates the left-hand side before the right-hand side.

In the below example, the last expression calls lists, then data , then []= on the result of lists.

  lists = ['ruby', 'python', 'scala']
  data = 'rust'
  lists[1] = data

Before

Multiple assignments didn’t work this way. Let’s checkout the below example.

  lists[1], tag.priority = data, num

Before Ruby 3.1, the above expression would be evaluated in the following order:

  1. data
  2. num
  3. lists
  4. []= called on the result of lists
  5. tag
  6. priority= called on the result of the tag

After

Starting with Ruby 3.1, multiple assignments evaluation order has been made consistent with single assignment evaluation order.

  lists[1], tag.priority = data, num

For the above expression, the left-hand side is evaluated before the right-hand side and the order is as below:

  1. lists
  2. tag
  3. data
  4. num
  5. []= called on the result of lists
  6. priority= called on the result of the tag