这里是解释
当您执行array.flatten 时,它会为您提供一个扁平数组,其中所有内部数组都排列整齐。现在,您将把这个 flatten 数组 放入 Hash::[] 方法中。但是Hash::[] 支持以下构造:
Hash[ key, value, ... ] → new_hash
# or
Hash[ [ [key, value], ... ] ] → new_hash
现在array.flatten 给你[1, 3, 2, 5, 3, 8]。现在你把这个数组放在Hash[] 中,就像Hash[[1, 3, 2, 5, 3, 8]] 一样。现在与上述两种结构进行比较。他们中的任何一个都匹配吗? 没有。所以你需要再次 splat 内部数组,因此它需要 (splatted operator)* 来 splat 内部数组。
现在您执行了Hash[*[1, 3, 2, 5, 3, 8]],得到了Hash[1, 3, 2, 5, 3, 8]。现在再次检查上述 2 个构造。它与 2 中的任何一个匹配吗?这次YES,第一个。所以你得到了想要的哈希{1=>3, 2=>5, 3=>8}。
顺便说一句,您不需要 splat,因为当您将 array 直接放入 Hash::[] 时,第二个结构完全匹配。
array = [[1,3],[2,5],[3,8]]
Hash[array] # => {1=>3, 2=>5, 3=>8}
上述方法有效,因为Hash[array] 表示Hash[[[1,3],[2,5],[3,8]]],正是文档建议的第二个结构。
阅读 some examples 了解 splatting 如何在 Ruby 中工作。
还有另一个构造:-
Hash[ object ] → new_hash
我认为告诉你为什么得到{}也很重要。 Hash[[1, 3, 2, 5, 3, 8]] 与文档中的最后一种构造类型相同。医生说 -
第二种和第三种形式采用单个参数,该参数可以是键值对数组或可转换为哈希的对象。
所以。 [1,3,2,5,3,8] 它是一个Array 对象不可转换 到Hash。目前它给你一个 empty hash,如果一个 object 根据第三个构造。但它会在未来的版本中抛出错误。请参阅下面的警告。
[1] pry(main)> Hash[[1,2]]
(pry):1: warning: wrong element type Fixnum at 0 (expected array)
(pry):1: warning: ignoring wrong elements is deprecated, remove them explicitly
(pry):1: warning: this causes ArgumentError in the next release
(pry):1: warning: wrong element type Fixnum at 1 (expected array)
(pry):1: warning: ignoring wrong elements is deprecated, remove them explicitly
(pry):1: warning: this causes ArgumentError in the next release
=> {}
我的 Ruby 版本是:
ruby 2.0.0p451 (2014-02-24 revision 45167) [i686-linux]