当*
运算符与类似的数组一起使用时,它称为splat 运算符。
将其视为删除数组周围第一级括号的运算符。这非常有用,因为您可以将数组转换为参数列表:
def stuff(x, y, z)
end
a = [1, 2, 3]
stuff(*a) # x,y,z gets assigned 1,2,3
同样的事情适用于Hash[]
. []
运算符 onHash
接受作为参数:
- 键值对的参数列表:
Hash["a", 1, "b", 2] #=> { "a" => 1, "b" => 2 }
- 表示键值的数组或数组对:
Hash[ [["a", 1], ["b", 2]] ] #=> { "a" => 1, "b" => 2 }
Hash[]
not 不接受普通的平面数组作为参数:
Hash[ ["a", 1, "b", 2] ] #=> {}
因此,考虑到这一点,再加上我们对 splat 运算符的理解,您现在可以看到正在发生的事情:
paired_array = a1.zip(a2)
=> [[1, "A"], [2, "B"], [3, "C"]]
plain_array = a1.zip(a2).flatten
=> [1, "A", 2, "B", 3, "C"]
# Per rule 2 above we know this works
Hash[paired_array]
=> {1=>"A", 2=>"B", 3=>"C"}
# This won't work
Hash[plain_array]
=> {}
# But if we turn the plain_array into an argument list,
# then we know per rule 1 above that this will work
Hash[*plain_array]
=> {1=>"A", 2=>"B", 3=>"C"}
现在你可能想知道当你这样做时发生了什么:
a = *plain_array
=> [1, "A", 2, "B", 3, "C"]
因为我们知道 splat 运算符有效地去除了括号,所以我们得到:
a = 1, "A", 2, "B", 3, "C"
...有趣的是,这是有效的 Ruby 代码,只是再次创建了一个数组。
您可以在 splat 运算符的rubyspec 测试用例中阅读有关 splat 运算符的更多有趣内容。