gpt4 book ai didi

ruby - Ruby 中的并行赋值运算符

转载 作者:数据小太阳 更新时间:2023-10-29 06:33:09 25 4
gpt4 key购买 nike

我正在看《Programming in 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

我没有得到想要的输出。

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

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

最佳答案

在 2 个单独的语句中进行赋值的问题是 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 来充当结构对于返回值或 return Object[] 并用强制转换使代码困惑。参见 this other question我最近回答了一个更实际的例子。

关于ruby - Ruby 中的并行赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2895957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com