Ruby 块变量中的括号

Ruby 块变量中的括号,ruby,arrays,ruby-1.9.3,parentheses,splat,Ruby,Arrays,Ruby 1.9.3,Parentheses,Splat,给定 1) 我明白这一点 a = [[:a, :b, :c]] a.each{|(x, y), z| p z} # => :b 有两个变量(x,y)和z,因此第三个元素:c被丢弃,并且z匹配:b。我明白这一点 a = [[:a, :b, :c]] a.each{|(x, y), z| p z} # => :b (x,y)匹配:a,因为它不是数组,所以它没有元素,因此y匹配nil 但是怎么做呢 a.each{|(x, y), z| p y} # => nil 工作?我希

给定

1) 我明白这一点

a = [[:a, :b, :c]]
a.each{|(x, y), z| p z} # => :b
有两个变量
(x,y)
z
,因此第三个元素
:c
被丢弃,并且
z
匹配
:b
。我明白这一点

a = [[:a, :b, :c]]
a.each{|(x, y), z| p z} # => :b
(x,y)
匹配
:a
,因为它不是数组,所以它没有元素,因此
y
匹配
nil

但是怎么做呢

a.each{|(x, y), z| p y} # => nil
工作?我希望返回
nil

2) 为什么返回值是这样的

a.each{|(x, y), z| p x} # => :a

我希望它们都返回nil,这是因为并行赋值的语法

因此,
a.每个
只有一个元素需要迭代,即
[:a,:b,:c]

在第一种情况下:

a = [[:a, :b, :c]]
这里
(x,y)
是一个数组,用于匹配第一个元素
:a
,并且
x
获取它,然后
z
仅匹配第二个元素
:b

在第二种情况下:

(x, y), z = [:a, :b, :c]
#=> x == :a, y == nil, z == :b
这里
(x,y)
作为一个完整的数组匹配数组
[:a,:b,:c]
,因此
x
y
分别获得
:a
:b

这就像需要“args+可选args(关键字args)+rest args”组合匹配提供的参数一样。按顺序接受参数就足够聪明了

另一个聪明的例子:

(x, y) = [:a, :b, :c]
#=> x == :a, y == :b

在上述任何一种情况下,它都只需对应该采取的措施做出最佳猜测。

好的,因此在第一种情况下,智能赋值发生两次,在第二部分,(x,y)=:a导致x=:a和y=nil。我明白了,很好。我一直在使用它,却没有意识到它与并行分配有关。我还发现了一个称之为“解构”的博客。