Ruby中的并行赋值算子
我正在阅读《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背景,看到这种类型的作业感觉很奇怪 还有
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, " " }