fruit = ["apple","red","banana","yellow"]
=> ["apple", "red", "banana", "yellow"]
Hash[*fruit]
=> {"apple"=>"red", "banana"=>"yellow"}
为什么splat导致数组被如此整齐地解析为Hash?
或者,更确切地说,哈希如何“知道”“苹果”是关键而“红色”是它的对应值?
仅仅是因为它们处于水果阵列的连续位置?
这里使用splat是否重要?哈希不能直接从arry定义自己吗?
答案 0 :(得分:10)
正如documentation所述:
Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}
Hash["a" => 100, "b" => 200] #=> {"a"=>100, "b"=>200}
{ "a" => 100, "b" => 200 } #=> {"a"=>100, "b"=>200}
您无法根据文档将数组传递给Hash[]
方法,因此splat只是爆炸 fruit
数组的一种方式,并且正常传递其元素Hash[]
方法的参数。实际上,这是splat运算符的一种非常常见的用法。
很酷的是,如果你试图将奇数个参数传递给Hash,你将获得ArgumentError
例外:
fruit = ["apple","red","banana","yellow","orange"]
#=> ["apple", "red", "banana", "yellow", "orange"]
Hash[*fruit] #=> ArgumentError: odd number of arguments for Hash
答案 1 :(得分:2)
查看Hash类中的公共类方法[]
。 (比如,over here.)它清楚地表明将创建一个新的Hash(实例)并使用给定的对象进行填充。当然,它们成对出现。当用作参数时,splat运算符实质上扩展了一个数组。