*在论证位置中的意义

  • 本文关键字:位置 ruby splat
  • 更新时间 :
  • 英文 :


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]

没问题!你不需要把任何东西弄平。

相关内容

  • 没有找到相关文章

最新更新