哈希[string.split(...)] vs Hash [* string.split(...)]

时间:2013-07-06 00:22:39

标签: ruby hash

试图理解为什么这会返回一个很好的填充哈希:

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

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

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

我看到星号是键,它表示一个可变长度的参数......但是Hash [...]的一个要求是它可以采用偶数编号的数组并将其转换为有效的哈希值。好吧,在我上面的第二个例子中,新行上的string.split返回一个偶数数组,那么Ruby为什么不允许呢?

2 个答案:

答案 0 :(得分:3)

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

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 ]

返回一个空哈希,因为你实际上给它一个奇数个参数,它们不会映射到一个正确的哈希值。

答案 1 :(得分:1)

完全赞同现有的答案,但这里有一个更明确的例子,可以澄清为什么在这种情况下需要splat:

test_string = "my\ntest\nstring"

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

正如你所看到的,没有splat你给Hash[]一个参数(一个数组),而不是多个参数。