Ruby中的并行赋值算子是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我正在学习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, " " }

这输出高达100的斐波那契数字。当我将并行任务替换为:

i1 = i2
i2 = i1+i2

我没有得到想要的输出。

提问于
用户回答回答于

在两个单独的语句中执行赋值的问题是,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
用户回答回答于

我有同样的问题。如果是这样写的,会更少混淆,更有意义:

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行是有意义的。

扫码关注云+社区