Ruby中的Parallel Assignment操作符

我正在阅读Ruby编程中的一个例子:

def fib_up_to(max) i1, i2 = 1, 1 # parallel assignment (i1 = 1 and i2 = 1) while i1 <= max yield i1 i1, i2 = i2, i1+i2 end end fib_up_to(100) {|f| print f, " " } 

这只是将Fibonacci数字打印到100。这没关系。 当我用以下内容替换并行赋值时:

 i1 = i2 i2 = i1+i2 

我没有得到所需的输出。

是否建议使用并行分配? 我来自Java背景,看到这种类型的赋值感觉真的很奇怪。

还有一个问题是:并行分配是运营商吗?

在2个单独的语句中进行赋值的问题是, i2 = i1 + i2将使用i1的新值而不是正确生成Fibonacci序列所需的先前值。

使用并行分配时,首先评估右侧的所有表达式,然后将其分配给左侧的接收变量。

并行分配不是特殊的运算符。 基本上右侧的内容充当一个数组,如果我们在左侧列出多个变量,那么数组将被解压缩并分配到相应的变量中。

以下是一些例子:

 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[]和使用强制转换使代码混乱。 看到我最近回答的另一个问题是一个更实际的例子。

我正在阅读同样的事情,并有同样的问题。 如果它是这样编写的话,它会更容易混淆并且更有意义:

 def fib_up_to(max) i1 = i2 = 1 while i1 <= max yield i1 i1, i2 = i2, i1+i2 end end fib_up_to(100) {|f| print f, " " } 

使用i1, i2 = 1, 1在我看来没有意义。 但是这种类型的分配确实对第5行有意义。