为什么在Ruby中表达式"a, b = 5"将a设置为5,但将b设置为nil?

6
(irb) a, b = 5
a => 5
b => nil

这不应该反过来吗?这里实际上发生了什么?

1
多重赋值将表达式的右侧视为展开的数组。a,b = 5被解释为a,b = *[5] - Chris Heald
1
如果你想要给两个变量都赋值,可以使用 a = b = 5 - Gumbo
3个回答

6

当我写这篇文章时,我的同事发现了原因:

Ruby将a, b = 5视为a, b = 5, nil

在Python3中,会抛出TypeError


1
如果你习惯于 JavaScript,那么 var a, b = 5 就是两个单独的赋值语句,这会让你感到惊讶。在 Ruby 中,列表赋值更像是 (a, b) = (5, nil) 的展开形式。左侧 被视为一个列表。当出现 a, b = 5, c = 3 时,情况变得更加混乱,结果是 a = 5, b = 3, c = 3 - tadman
如果你把 a, b = 5, c = 3 看作是 a, b = *[5, c = 3],那么它就不会那么令人困惑了。 - Chris Heald

2
为了使用多重赋值给b分配一个值,您需要给它第二个值。
a, b = 5, 6

a = 5
b = 6

当您不提供第二个值时,Ruby会将b赋值为nil

1

这是一个重要的 Ruby 特性,称为多重赋值。

多重赋值可以从表达式或数组中执行多个赋值。这是一种快速同时赋值多个变量的方法。

如果您声明了三个变量,但只给其中两个赋值,则第三个变量将默认接收 nil

此文档 的多重赋值部分解释了该特性以及几个示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接