Ruby中的并行赋值算子

Ruby中的并行赋值算子,ruby,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, " " } 我没有得到期望的输出 建议使用平行作业吗?我有Java背景,看到这种类型的作业感觉很奇怪 还有

我正在阅读《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, " " }
我没有得到期望的输出

建议使用平行作业吗?我有Java背景,看到这种类型的作业感觉很奇怪


还有一个问题是:并行赋值是运算符吗?

在两个单独的语句中进行赋值的问题是,
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[]
并用强制转换将代码混乱起来。看看我最近回答的一个更实际的例子。

我在读同样的东西,有同样的问题。如果它是这样写的,那么就不会那么混乱,也会更有意义:

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, " " }
def fib up(最大值)
i1=i2=1

虽然i1,我通常对
a=b=1
类型的赋值有点谨慎,因为它与
a=1不是完全相同的事情;b=1
,但
a=(b=1)
,即“让
a
成为
b=1
”的结果@Frost这不是一个好主意或可能出错的例子是什么?你也可以这样做:[1]
*从_first,last=1,2,3,4
[2a]
*从_first=>[1,2,3]
[2b]
last=4
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, " " }