假设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
,它会给你一个扁平的阵列,其中所有内部阵列都是板条的。现在您将这个扁平数组放入Hash::[]
方法中。但Hash::[]
支持以下构造:
Hash[ key, value, ... ] → new_hash
# or
Hash[ [ [key, value], ... ] ] → new_hash
现在array.flatten
给你[1, 3, 2, 5, 3, 8]
。现在你把这个数组放在里面Hash[]
like 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 中的任何一个匹配吗?这次是,第一个。所以你得到了想要的 hash {1=>3, 2=>5, 3=>8}
。
顺便说一句,您不需要 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 中的splatting是如何工作的。
还有另一种构造:-
Hash[ object ] → new_hash
我认为这也很重要,告诉你你为什么得到{}
. Hash[[1, 3, 2, 5, 3, 8]]
与文档中的最后一种构造类型相同。医生说——
第二种和第三种形式采用单个参数,该参数可以是键值对数组或可转换为哈希的对象。
所以。[1,3,2,5,3,8]
它是一个不可转换为的Array
对象。目前它给你一个空的 hash,如果一个对象按照第三个构造。但它会在未来的版本中抛出错误。请参阅下面的警告。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[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]
工作正常!你不必压扁或溅出任何东西。