设arr
为数组[[1,3],[2,5],[3,8]]
。我想知道*
是什么意思。这是什么意思?
hash = Hash[*arr.flatten] # => {1=>3, 2=>5, 3=>8}
我试了下面的
arr.flatten # => [1, 3, 2, 5, 3, 8]
Hash[arr.flatten] # => {}
Hash[*a.flatten] # => {1=>3, 2=>5, 3=>8}
解释如下
当您执行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]]
一样。现在比较一下上面两个结构。有匹配的吗?。因此,您需要再次拆分内部数组,因此需要(拆分操作符)*
来拆分内部数组。
现在你做了Hash[*[1, 3, 2, 5, 3, 8]]
,得到Hash[1, 3, 2, 5, 3, 8]
。现在再次检查上述2个构造。它和这两个中的任何一个匹配吗?这次YES,第一个。因此,您得到了所需的哈希值{1=>3, 2=>5, 3=>8}
。
BTW,您不需要splat,因为当您将数组直接放入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]]]
,这正好是文档中建议的第二个结构。
阅读一些示例来了解在Ruby中如何使用。
还有另一个结构:-
Hash[ object ] → new_hash
我认为这也很重要,告诉你为什么你得到{}
。Hash[[1, 3, 2, 5, 3, 8]]
与文档中最后一种类型的结构相同。文档显示-
第二和第三种形式接受单个参数,该参数要么是键值对数组,要么是可转换为散列的对象。
。[1,3,2,5,3,8]
它是Array
对象不能转换到Hash
。目前它给你一个空哈希,如果一个对象按照第三个结构。但它会抛出错误在未来的版本发布。参见下面的警告。
[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]
当你向Hash类传递参数时,你可以把它放在括号里…
Hash(arr.flatten)
或不…
Hash arr.flatten
在这两种情况下,Hash都接受参数,如果它是一个包含偶数个元素的数组,它将创建一个散列,其中奇数元素是键,偶数元素是值。
Hash也可以使用方括号来执行类似的操作
Hash[1, 2]
=> {1=>2}
但是,当你这样做的时候…
Hash[arr.flatten]
你在数组内传递数组,所以你会得到意想不到的结果。
当你这样做的时候…
Hash[*arr.flatten]
你说的是把数组arr.flatten
传递给它,不是作为一个数组,而是作为单独的参数传递给方法。
所以Hash[arr.flatten]
实际上是Hash[[1, 3, 2, 5, 3, 8]]
(一个包含一个元素的数组)而Hash[*arr.flatten]
实际上是Hash[1, 3, 2, 5, 3, 8]
(一个包含六个元素的数组)
有趣的是,[]方法可以接受一个包含键、值对数组的数组。
Hash[arr]
没问题!你不需要把任何东西弄平。