Ruby中的Parallel Assignment操作符

bra*_*boy 18 ruby

我正在阅读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, " " }
Run Code Online (Sandbox Code Playgroud)

这只是将Fibonacci数字打印到100.这很好.当我用以下内容替换并行分配时:

i1 = i2
i2 = i1+i2
Run Code Online (Sandbox Code Playgroud)

我没有得到所需的输出.

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

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

mik*_*kej 33

在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]
Run Code Online (Sandbox Code Playgroud)

它是ruby的一个有用特性,例如它有助于获得返回多个值的方法,例如

def sum_and_difference(a, b)
  a + b, a - b
end

sum, difference = sum_and_difference 5, 3
Run Code Online (Sandbox Code Playgroud)

在Java中,最接近的方法是返回一个方法,int[]但是如果我们想要返回一个字符串和一个数字,我们需要创建一个小的POJO来作为返回值的结构,或者返回Object[]并使用强制转换来混淆代码.看到我最近回答的另一个问题是一个更实际的例子.

  • 你也可以这样做:[1]`*from_first,last = 1,2,3,4` [2a]`*from_first => [1,2,3]`[2b]`last = 4` (2认同)