我正在关注RubyMonk教程.有一个部分涉及splat运算符,以及如何将它与Hash一起使用.这是有效的代码:
puts Hash[4, 8]
puts Hash[ [[4, 8], [15, 16]] ]
Run Code Online (Sandbox Code Playgroud)
但后来它说你也可以使用:
ary = [[4, 8], [15, 16], [23, 42]]
puts Hash[*ary.flatten]
Run Code Online (Sandbox Code Playgroud)
为什么有人会使用最后一种形式创建哈希,而不是Hash[ary]直接做?
有几种方法可以初始化哈希.您可以传递它的数组或只列出键和值.文档中的示例:
Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}
Hash[ [ ["a", 100], ["b", 200] ] ] #=> {"a"=>100, "b"=>200}
Run Code Online (Sandbox Code Playgroud)
请注意,没有接受单级数组的表单.它是数组数组或根本没有数组.需要使用splat将扁平化数组"扩展"为简单的参数列表(因此,使其行为与示例中的第一个形式相同)
根据ruby版本,这将返回空哈希或引发错误.
RUBY_VERSION # => "2.1.5"
ary = [[4, 8], [15, 16], [23, 42]].flatten
ary # => [4, 8, 15, 16, 23, 42]
Hash[ary] # => {} # !> this causes ArgumentError in the next release
Run Code Online (Sandbox Code Playgroud)
这显然没有意义*ary.flatten(只是使用ary),但你可能从其他地方获得这个平面数组.那时候你需要把它扯掉.