为什么使用splat运算符创建哈希?

时间:2015-09-02 16:05:25

标签: ruby

我正在关注RubyMonk教程。有一个部分涉及splat运算符,以及如何将它与Hash一起使用。 这是有效的代码:

puts Hash[4, 8]
puts Hash[ [[4, 8], [15, 16]] ]

然后它说你也可以使用:

ary = [[4, 8], [15, 16], [23, 42]]
puts Hash[*ary.flatten]

为什么有人会使用最后一种形式创建哈希,而不是直接执行Hash[ary]

2 个答案:

答案 0 :(得分:6)

有几种方法可以初始化哈希。您可以传递它的数组或只列出键和值。文档中的示例:

Hash["a", 100, "b", 200]             #=> {"a"=>100, "b"=>200}
Hash[ [ ["a", 100], ["b", 200] ] ]   #=> {"a"=>100, "b"=>200}

请注意,没有接受单级数组的表单。它是数组数组或根本没有数组。需要使用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

显然没有意义*ary.flatten(只使用ary),但你可能从其他地方获得这个平面数组。那时候你需要把它甩掉。

答案 1 :(得分:3)

Hash[ary]Hash[*ary.flatten]之间的一个区别是,如果无法将数组干净地转换为哈希,则会出现这种情况。例如,考虑一下这个对象:

# ary now contains an array with more than two values
ary = [[4, 8, 9], [15, 16], [23, 42]]

# Calling Hash[ary] will succeed by ignoring the invalid array
puts Hash[ary] # => {15=>16, 23=>42}

# Calling Hash[*ary.flatten] will return the expected error
puts Hash[*ary.flatten]
# => class: ArgumentError
# => message: odd number of arguments for Hash
# => backtrace: RubyMonk:4:in `[]'

如果您正在尝试了解splat实际上为您做了什么,我强烈推荐这篇文章(它不是很新,但仍然非常适用)。

https://endofline.wordpress.com/2011/01/21/the-strange-ruby-splat/