Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么单个空数组的并行分配会分配多个零?_Ruby_Parallel Assignment - Fatal编程技术网

Ruby 为什么单个空数组的并行分配会分配多个零?

Ruby 为什么单个空数组的并行分配会分配多个零?,ruby,parallel-assignment,Ruby,Parallel Assignment,我想给多个变量分配一个空数组。以下是我正在做的: 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 它给我零分。我想知道为什么?但如果我这样做: irb(main):019:0> a, b, c = [], [], [] => [[], [], []] irb

我想给多个变量分配一个空数组。以下是我正在做的:

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
它给我零分。我想知道为什么?但如果我这样做:

irb(main):019:0> a, b, c = [], [], []
=> [[], [], []]
irb(main):020:0> a
=> []
irb(main):021:0> b
=> []
irb(main):022:0> c
=> []
然后它就像我预期的那样工作,但是它比第一个稍微长一点。第一个例子有什么问题

a = b = c = []
但请注意,所有变量都将分配给同一个数组 因此:

但请注意,所有变量都将分配给同一个数组 因此:


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

[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

现在回到您的问题,您正在尝试将空数组中的元素分配给变量,结果,这三个变量的值都为零。

我相信此示例将帮助您理解问题:

[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值。

单右值并行分配 如果赋值包含多个左值和一个右值,Ruby会尝试将右值扩展到数组中,就像调用右值上的a一样。因此,您的示例a,b,c=[]的问题在于,它在语义上等价于:

a, b, c = nil.to_a
这显然会将nil赋值给第一个变量,而将其他变量也赋值为nil。相比之下,考虑一下:

a, b, c = 1
a
# => 1
b
# => nil
c
# => nil
同样的原理也在起作用,但现在您可以看到第一个左值确实收到了来自右侧的赋值;当赋值为零时,这并不明显。

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

a, b, c = nil.to_a
这显然会将nil赋值给第一个变量,而将其他变量也赋值为nil。相比之下,考虑一下:

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

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

执行并行赋值时,Ruby destructures数组:

a, b, c = [:foo, :bar, :baz]
a # => :foo
b # => :bar
c # => :baz
如果给它一个包含太少条目的数组,它会将剩余值设置为nil:


因此,您的第一个示例只是对它的自然扩展—空数组的条目太少,无法分配任何变量

Ruby在执行并行分配时会分解数组:

a, b, c = [:foo, :bar, :baz]
a # => :foo
b # => :bar
c # => :baz
如果给它一个包含太少条目的数组,它会将剩余值设置为nil:


因此,您的第一个示例只是对它的自然扩展—空数组的条目太少,无法分配任何变量

第一个没有问题。Ruby的响应正确。你声称这是错的是什么?你是想乘以你肯定不能用数组做的变量的值,还是想要多个变量?第一个变量没有错。Ruby的响应正确。你声称这是错误的是什么?你是想乘以你肯定不能用数组来做的变量的值,还是想要多个变量?如果是,为什么a=nil.to_a=>[];irbmain:028:0>a=>[]。为什么a等于[]而不是我的例子中的nil?这显然会将nil赋值给第一个变量,而将其他变量也赋值为nil。相比之下,考虑一下这一点:但是A给了我零,而不是[] @ AlanDert,它不是在分配一个空数组;它正在分配空数组的第一个值。如果是,为什么a=nil.to_a=>[];irbmain:028:0>a=>[]。为什么a等于[]而不是我的例子中的nil?这显然会将nil赋值给第一个变量,而将其他变量也赋值为nil。相比之下,考虑一下这一点:但是A给了我零,而不是[] @ AlanDert,它不是在分配一个空数组;它指定空数组的第一个值。