特定
a = [[:a, :b, :c]]
1)我理解这一点
a.each{|(x, y), z| p z} # => :b
有两个变量(x, y)
和z
,所以第三个元素:c
被丢弃,z
匹配:b
。我理解这一点
a.each{|(x, y), z| p y} # => nil
(x, y)
匹配:a
,因为它不是一个数组,所以没有元素,所以y
匹配nil
。
但是怎么做
a.each{|(x, y), z| p x} # => :a
工作?我期待nil
被退回。
2)为什么返回值是这样的?
a.each{|(x, y)| p x} #=> :a
a.each{|(x, y)| p y} #=> :b
我希望他们都返回nil
。
这是因为并行赋值的语法。
a = [[:a, :b, :c]]
所以a.each
只有一个要迭代的元素,即[:a, :b, :c]
。
在第一种情况下:
(x, y), z = [:a, :b, :c]
#=> x == :a, y == nil, z == :b
这里(x, y)
是一个匹配第一个元素:a
的数组,而x
得到它,然后z
只匹配第二个元素:b
。
在第二种情况下:
(x, y) = [:a, :b, :c]
#=> x == :a, y == :b
这里(x, y)
作为一个完整的数组匹配数组[:a, :b, :c]
,所以x
和y
分别获得:a
和:b
。
这就像要求“args + optional args(keyword args)+ rest args”组合匹配提供的参数。它足够聪明,可以通过序列来获取参数。
另一个聪明的例子
(a,b) = 1,2
=> [1, 2] # array match
#=> a == 1, b == 2
(a,b)=[1,2]
=> [1, 2] # array match
#=> a == 1, b == 2
在上面的任何一种情况下,它都会简单地猜测应该采取什么措施。