在两个单独的语句中进行赋值的问题是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[]
并通过强制转换使代码变得混乱。看这另一个问题 https://stackoverflow.com/questions/2793495/returning-true-or-error-message-in-ruby/2793517#2793517我最近回答了一个更实际的例子。