3

你好 StackOverflow 工作人员!

我们正在做一些 Ruby,出现了一个我们似乎很难弄清楚的例子:

a=5
b=4
a,b=a+b,a

=> [9,5]
=> a=9
=> b=5

怎么会?那里发生了什么?为什么它起作用而“a,b,a”不起作用?为什么“b”变成5而“a”变成9?

如果我们只写

a,b=a+b

=> 9
=> a=9
=> b=nil

我们猜测这是某种 Ruby 错误,将在 2.5 版中修复。或者可能有一些基本的法律已经实施,我们只是还没有看到。

你们会帮助我们吗?

示例代码是斯坦福 Ruby 课程的一个测验问题的一部分。他们告诉我们在遇到困难时去问问 StackOverflow 天才。

4

4 回答 4

5

对我来说,您似乎误解了并行赋值运算符的用法,而不是 Ruby 错误。

前面的例子和后面的例子有很大的不同。让我们把它们放在一起:

a,b=a+b,a
a,b=a+b

现在添加一些空格

a,b =  a+b, a
a,b =  a+b

第一个表达式是 的 LHSa, b和 RHS 的a+b , a并行赋值,后者是 的 LHSa, b和 RHS 的并行赋值a+b。请注意 RHS 的差异。

这两个等于:

(1)

a =  a+b
b =  a'   **

(2)

a =  a+b
b =  nil

但是,请注意,这一切都是一次操作。因此,在 (1) 的情况下,它是 A' 而不是 A:使用 'a' 的 OLD VALUE,而不是刚刚分配的 'a+b' 的值 - 因为原始并行分配是一个操作,而不是两个操作就像我为了描述的目的在这里爆炸它一样。

这意味着:

a,b = a+b, a

导致s1=a+b被计算,s2=a被计算,然后a=s1; b=s2;只是在“一次操作”中。

因为它是一个操作,并且当它分配给两个值时,所以会返回一个包含两个元素的数组——这与执行单一分配并返回单个值相反。

如果您要执行三重赋值:

a,b,c,d,e,f  = 0,1,2,3,4,5

[0,1,2,3,4,5] 的数组将是结果,并且 a/b/c/d/e/f 将分别被分配 0/1/2/3/4/5 值。

有关更多信息,请参阅 Ruby 的并行赋值文档,也可能还有用于数组扩展和参数分组的 * 运算符

于 2013-03-07T16:11:42.333 回答
4

=运算符允许使用逗号“并行”分配多个值。

例如:

a,b=1,2

将分配a1和。b2

同样地,

a,b=a+b,a

a=5b=4是:

a,b=5+4,5

这是:

a,b=9,5

因此,a将被分配 9 和b5。

于 2013-03-07T16:10:21.510 回答
2

替换值可能更有意义。

a = 5
b = 4
a, b = a + b, a
a, b = [5 + 4], 5
a, b = [9, 5]

a, b = [a + b]
a, b = [a + b], nil # implicit nil
a, b = [5 + 4], nil

并行赋值相当于将右侧分配给数组,然后将变量按顺序分配给数组中具有该索引的项。

在您的第二个示例中存在隐式 nil 的原因是 ruby​​ 在不存在的数组索引上查找的方式。

array = []
array[0] # nil
于 2013-03-07T16:12:00.803 回答
2

这是因为在第一个示例中,您将 的值设置b为等于a

a = 5
b = 4
a,b=a+b,a

所以a=5+4 b=5

于 2013-03-07T16:12:33.957 回答