2013-07-06 178 views
1

试图了解为什么它返回一个很好的填充哈希:哈希[string.split(...)]对哈希[* string.split(...)]

Hash[*myString.split("\n")] 

虽然这将返回一个空哈希?

Hash[myString.split("\n")] 

我看到,星号是关键,这标志着可变长度的参数...但哈希的要求之一[...]是,它可以采取偶数阵列并把它变成一个有效的散列。那么,在上面的第二个例子中,新行上的string.split返回一个偶数数组,为什么Ruby不允许它?

回答

3

这是因为splat *字符将数组扩展为每个单独的元素,而不是将数组作为整体传入。从红宝石2.0哈希文档:

Hash["a", 100, "b", 200]    #=> {"a"=>100, "b"=>200} 
Hash[ [ ["a", 100], ["b", 200] ] ] #=> {"a"=>100, "b"=>200} 
Hash["a" => 100, "b" => 200]   #=> {"a"=>100, "b"=>200} 

传递使用Hash[]方法的元素简单地格式化你所期望的哈希值。相比之下,与

Hash[ Array.new ] 

它返回一个空的哈希,因为你基本上给它一个奇数的参数,这将不会映射到正确的哈希值。

+0

优秀的答案。当你说splat字符将数组扩展到每个单独的元素时,它会为我点击。传递一个数组不会被视为传递多个参数,因为它只是一个对象。谢谢! (一旦网站允许我将标记为答案)。 – mariocatch

+0

很高兴能帮到你!其实我从来没有想过用这种方法实例化哈希,所以查看文档教会了我一两件事! –

1

完全与现有的答案达成一致,但在这里可以解释,为什么需要在这种情况下,图示一个更明显的例子:

test_string = "my\ntest\nstring" 

[test_string.split("\n")] #=> [["my", "test", "string"]] 
[*test_string.split("\n")] #=> ["my", "test", "string"] 

因此,大家可以看到,不用你给Hash[]一个提示图标单个参数(一个数组),而不是多个参数。

+0

太棒了,谢谢Matt! – mariocatch