首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ruby中的并行赋值运算符

Ruby中的并行赋值运算符
EN

Stack Overflow用户
提问于 2010-05-24 17:31:56
回答 2查看 12.1K关注 0票数 18

我正在学习Ruby中的一个例子:

代码语言:javascript
复制
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。这很好。当我将并行赋值替换为:

代码语言:javascript
复制
i1 = i2
i2 = i1+i2

我没有得到想要的输出。

建议使用并行赋值吗?我有Java背景,看到这种类型的任务感觉真的很奇怪。

另一个问题是:并行分配是运算符吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-24 17:39:01

在两个单独的语句中进行赋值的问题是,i2 = i1 + i2将使用i1的新值,而不是正确生成斐波那契序列所需的前一个值。

当您使用并行赋值时,右侧的所有表达式都将首先求值,然后再赋值给左侧的接收变量。

并行赋值不是一个特殊的运算符。从本质上讲,右边的东西就像一个数组,如果我们在左边列出了多个变量,那么这个数组就会被解包并赋值到各个变量中。

下面是更多的例子:

代码语言:javascript
复制
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的一个有用的特性,例如,它有助于拥有返回多个值的方法。

代码语言:javascript
复制
def sum_and_difference(a, b)
  a + b, a - b
end

sum, difference = sum_and_difference 5, 3

在Java语言中,最接近的方法是返回int[],但是如果我们想返回一个字符串和一个数字,我们需要创建一个小POJO来充当返回值或返回Object[]的结构,并使用强制转换使代码变得混乱。有关更实际的示例,请参阅我最近回答的this other question

票数 34
EN

Stack Overflow用户

发布于 2012-06-26 21:11:24

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

代码语言:javascript
复制
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行来说是有意义的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2895957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档