试图理解为什么这会返回一个很好的填充哈希:
Hash[*myString.split("\n")]
虽然这返回一个空哈希?
Hash[myString.split("\n")]
我看到星号是关键,它表示可变长度参数......但 Hash[...] 的要求之一是它可以采用偶数数组并将其转换为有效的哈希。好吧,在我上面的第二个示例中,新行上的 string.split 返回一个偶数数组,那么为什么 Ruby 不允许它呢?
这是因为 splat*
字符将数组扩展为每个单独的元素,而不是作为一个整体传入数组。来自 Ruby 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 ]
它返回一个空哈希,因为您实际上是给它提供了奇数个参数,这些参数不会映射到正确的哈希。
完全同意现有的答案,但这里有一个更明确的例子,可以阐明为什么在这种情况下需要 splat:
test_string = "my\ntest\nstring"
[test_string.split("\n")] #=> [["my", "test", "string"]]
[*test_string.split("\n")] #=> ["my", "test", "string"]
如您所见,如果没有 splat,您将给出Hash[]
一个参数(一个数组),而不是多个参数。