1

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

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

虽然这返回一个空哈希?

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

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

4

2 回答 2

3

这是因为 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 ]

它返回一个空哈希,因为您实际上是给它提供了奇数个参数,这些参数不会映射到正确的哈希。

于 2013-07-06T00:31:52.000 回答
1

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

test_string = "my\ntest\nstring"

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

如您所见,如果没有 splat,您将给出Hash[]一个参数(一个数组),而不是多个参数。

于 2013-07-06T00:37:12.653 回答