0

假设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}
4

2 回答 2

1

这是解释

当你这样做时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]
于 2014-06-20T17:06:04.460 回答
0

当您将参数传递给 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]

工作正常!你不必压扁或溅出任何东西。

于 2014-06-20T17:38:05.637 回答