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。事实上,这是正确的。整个数组是右值,但数组文字中的元素是从左到右求值的。