哈希[string.split(...)]对哈希[* string.split(...)]
问题描述:
试图了解为什么它返回一个很好的填充哈希:哈希[string.split(...)]对哈希[* string.split(...)]
Hash[*myString.split("\n")]
虽然这将返回一个空哈希?
Hash[myString.split("\n")]
我看到,星号是关键,这标志着可变长度的参数...但哈希的要求之一[...]是,它可以采取偶数阵列并把它变成一个有效的散列。那么,在上面的第二个例子中,新行上的string.split返回一个偶数数组,为什么Ruby不允许它?
答
这是因为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 ]
它返回一个空的哈希,因为你基本上给它一个奇数的参数,这将不会映射到正确的哈希值。
答
完全与现有的答案达成一致,但在这里可以解释,为什么需要在这种情况下,图示一个更明显的例子:
test_string = "my\ntest\nstring"
[test_string.split("\n")] #=> [["my", "test", "string"]]
[*test_string.split("\n")] #=> ["my", "test", "string"]
因此,大家可以看到,不用你给Hash[]
一个提示图标单个参数(一个数组),而不是多个参数。
+0
太棒了,谢谢Matt! – mariocatch
优秀的答案。当你说splat字符将数组扩展到每个单独的元素时,它会为我点击。传递一个数组不会被视为传递多个参数,因为它只是一个对象。谢谢! (一旦网站允许我将标记为答案)。 – mariocatch
很高兴能帮到你!其实我从来没有想过用这种方法实例化哈希,所以查看文档教会了我一两件事! –