从数组中创建哈希 - 这是如何工作的?

时间:2009-09-22 04:23:31

标签: ruby hash splat

fruit = ["apple","red","banana","yellow"]
=> ["apple", "red", "banana", "yellow"]

Hash[*fruit]    
=> {"apple"=>"red", "banana"=>"yellow"}

为什么splat导致数组被如此整齐地解析为Hash?

或者,更确切地说,哈希如何“知道”“苹果”是关键而“红色”是它的对应值?

仅仅是因为它们处于水果阵列的连续位置?

这里使用splat是否重要?哈希不能直接从arry定义自己吗?

2 个答案:

答案 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运算符实质上扩展了一个数组。