2

我想将一个空数组分配给多个变量。这是我正在做的事情:

irb(main):015:0> a, b, c = []
=> []
irb(main):016:0> a
=> nil
irb(main):017:0> b
=> nil
irb(main):018:0> c
=> nil

它给了我nil。我想知道为什么?但如果我这样做:

irb(main):019:0> a, b, c = [], [], []
=> [[], [], []]
irb(main):020:0> a
=> []
irb(main):021:0> b
=> []
irb(main):022:0> c
=> []

然后它按我的预期工作,但它比第一个长一点。第一个例子有什么问题?

4

4 回答 4

2

我相信这个例子会帮助你理解这个问题:

[1] pry(main)> a, b, c = [1,2]
=> [1, 2]
[2] pry(main)> a
=> 1
[3] pry(main)> b
=> 2
[4] pry(main)> c
=> nil

现在回到你的问题,你试图将一个空数组中的元素分配给变量,结果这三个变量都得到 nil 值。

于 2013-01-20T09:22:10.160 回答
1
a = b = c = []

但请注意,所有变量都将被分配相同的数组
,因此:

a = b = []
b << 1
p b        # [1]
p a        # [1]
于 2013-01-20T09:10:11.320 回答
1

具有单个右值的并行赋值

如果赋值包含多个左值和一个右值,Ruby 会尝试将右值扩展为一个数组,就像您在右值上调用了 #to_a 一样。因此,您的示例的问题a, b, c = []在于它在语义上等同于:

a, b, c = nil.to_a

这显然会将 nil 分配给第一个变量,而其他变量则未分配(这也是 nil)。相反,考虑一下:

a, b, c = 1
a
# => 1
b
# => nil
c
# => nil

同样的原理也在起作用,但现在你可以看到第一个左值确实从右侧接收了一个赋值;当任务为零时,这并不明显。

于 2013-01-20T09:50:59.557 回答
0

当您进行并行赋值时,Ruby 会解构数组:

a, b, c = [:foo, :bar, :baz]
a # => :foo
b # => :bar
c # => :baz

如果你给它一个条目太少的数组,它会将剩余的值设置为nil

a, b, c = [:foo, :bar]
a # => :foo
b # => :bar
c # => nil

所以你的第一个例子只是这个的自然扩展——一个空数组肯定有太少的条目来分配任何变量!

于 2013-01-22T00:06:52.520 回答