Ruby变量赋值

Ruby变量赋值,ruby,variable-assignment,Ruby,Variable Assignment,有人能解释一下这种行为吗: a = b = c = 1, 2, 3 a # => [1, 2, 3] b # => 1 c # => 1 在赋值a=b=c=1,2,3中,变量a、b和c应赋值[1,2,3]。有什么想法吗?你被搞糊涂了 a=b=c=1,2,3 实际上是: a = (b = c = 1), 2, 3 剩下的 c = 1 # => 1 b = c # => 1 a = 1,2,3 # => [1, 2, 3] 要做到你所说的,你应该做

有人能解释一下这种行为吗:

a = b = c = 1, 2, 3 
a # => [1, 2, 3]
b # => 1
c # => 1
在赋值
a=b=c=1,2,3
中,变量
a
b
c
应赋值
[1,2,3]
。有什么想法吗?

你被搞糊涂了

a=b=c=1,2,3
实际上是:

a = (b = c = 1), 2, 3
剩下的

c = 1 # => 1 
b = c # => 1 
a = 1,2,3 # => [1, 2, 3] 

要做到你所说的,你应该做以下几点:

a,b,c = 1,2,3
    p a #=> 1
    p b #=> 2
    p c #=> 3
有人能解释为什么会这样吗

@希瓦姆回答了这个问题,但添加一些括号可能会更清楚地说明问题

a = b = c = 1, 2, 3
被解释为:

a = [(b = (c = 1)), 2, 3]
a = (b = (c = [1, 2, 3]))
表达式的求值顺序如下:

           c = 1
      b = (     )
a = [(           ), 2, 3]
          c = [1, 2, 3]
     b = (             )
a = (                   )
变量
a
b
c
应分配
[1,2,3]

要获得预期结果,您可以编写:

a = b = c = [1, 2, 3]
这被解释为:

a = [(b = (c = 1)), 2, 3]
a = (b = (c = [1, 2, 3]))
并按以下顺序进行评估:

           c = 1
      b = (     )
a = [(           ), 2, 3]
          c = [1, 2, 3]
     b = (             )
a = (                   )

是的,我自己通过在控制台中玩发现了这一点。这种行为背后的原因是什么,我们知道它的
a=(b=c=1),2,3
,即使我们使用了3个以上的变量,行为也是一样的@RSB对不起,我没有得到你的评论。OP没有做平行作业。他正在把一个物体分配给另一个物体。这使得
b
具有与
c
相同的对象,但不能将相同的对象分配给
a
,因为OP在分配后给出了
2,3
(顺便说一句,这是并行分配)。我想我的展开式清楚地解释了这一点?@shivam我不认为有任何并行赋值,因为没有多个逗号分隔的变量。它只是给整个数组分配一个数组。@SachinPrasad您是对的。最终没有并行分配。在那一点上我错了为什么表达式余数
,2,3
在计算
a
之前,而不是在计算
c
甚至
b
之前(尽管这更有意义)?我看不出背后的逻辑。普通语言是否先计算右值,然后将其分配给左值?@BorisB。也许这是误导。我只是想指出,第一个赋值是
c=1
,然后是
b=…
,最后是
a=…
@BorisB。事实上,这是正确的。整个数组是右值,但数组文字中的元素是从左到右求值的。