Проблема с выполнением присваивания в 2 отдельных операторах заключается в том, что i2 = i1 + i2
будет затем использовать новое значение i1
вместо предыдущего значения, необходимого для правильной генерации последовательности Фибоначчи.
Когда вы используете параллельное присваивание, все выражения с правой стороны сначала вычисляются, а затем присваиваются получающим переменным с левой стороны.
Параллельное присваивание не является специальным оператором. По существу, то, что находится справа, действует как массив, где, если мы перечисляем несколько переменных слева, массив распаковывается и присваивается соответствующим переменным.
Вот еще несколько примеров:
irb(main):020:0> a = 1, 2 # assign to a single variable
=> [1, 2]
irb(main):021:0> a
=> [1, 2]
irb(main):022:0> a, b = 1, 2 # unpack into separate variables
=> [1, 2]
irb(main):023:0> a
=> 1
irb(main):024:0> b
=> 2
irb(main):025:0> a, b = [1, 2, 3] # 3 is 'lost' as no receiving variable
=> [1, 2, 3]
irb(main):026:0> a
=> 1
irb(main):027:0> b
=> 2
irb(main):028:0> first, *rest = [1, 2, 3] # *rest consumes the remaining elements
=> [1, 2, 3]
irb(main):029:0> first
=> 1
irb(main):030:0> rest
=> [2, 3]
Это полезная функция ruby, например, она облегчает использование методов, которые возвращают несколько значений, например,
def sum_and_difference(a, b)
a + b, a - b
end
sum, difference = sum_and_difference 5, 3
В Java самым близким было бы наличие метода, возвращающего int[]
, но если бы мы хотели вернуть строку и число, нам нужно было бы создать небольшой POJO, который будет действовать как структура для возвращаемого значения или возврата Object[]
и загромождать код забросами. См. этот другой вопрос , на который я недавно ответил, для более практического примера.