任何人都可以解释我如何将数组转换为Hash
吗?将数组转换为散列
puts Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
我不理解什么happens
当我们调用Hash[*[]]].flatten]
后面。
任何人都可以解释我如何将数组转换为Hash
吗?将数组转换为散列
puts Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
我不理解什么happens
当我们调用Hash[*[]]].flatten]
后面。
你只需要做:
Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']]]
# => {:first_name=>"Shane", :last_name=>"Harvie"}
看那documentation语法:
Hash[ key, value, ... ] → new_hash
Hash[ [ [key, value], ... ] ] → new_hash
如果使用faltten
然后下面是结果: -
[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
# => [[:first_name, "Shane", :last_name, "Harvie"]]
如果你确实使用splat与faltten
,那么你会得到如下:
[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
# => [:first_name, "Shane", :last_name, "Harvie"]
现在,Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
会给你的哈希,作为我顶代码提供。但您不需要做这么多工作,因为Hash
文档与您的输入数据明显匹配,所以只有Hash[input_data]
就足够了。
首先阵列被压扁:
[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten
# becomes: [:first_name, 'Shane', :last_name, 'Harvie']
由于Hash#[]
method接受的参数等,从而
Hash['a', 'b', 'c', 'd']
和任意数量的不需要使用的图示符(*
)的阵列,以展开堆叠上的阵列,以便将这些值用作参数
Hash[*[:first_name, 'Shane', :last_name, 'Harvie']]
# becomes: Hash[:first_name, 'Shane', :last_name, 'Harvie']
而奥雅纳是正确的,你不需要扁平化,因为Hash#[]
方法也接受2d阵列。
Hash
类定义了一种方法[]
。这个方法可以使用任意数量的参数,每个参数对都会创建一个新的散列,每个散列对的第一个元素是键,第二个元素是一个值。如果你传递了奇数的ov参数,这将失败。它还允许您传递2d数组或任意数量的2个元素数组。
现在你有2d阵列:[[:first_name, 'Shane'], [:last_name, 'Harvie']]
。当你调用压扁,你合并所有内部阵列中一个:
Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
Hash[[:first_name, 'Shane', :last_name, 'Harvie']]
现在,如果你使用的图示操作,你提取所有的元素,并将它们传递给[]
方法作为独立参数,所以这个transaltes到:
Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
Hash[:first_name, 'Shane', :last_name, 'Harvie']
但请注意,它不是必需的 - Hash[]
可以处理初始形式。只要做到:
Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']]]
我们得到什么,而无需使用图示*的: -
[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
#=> [[:first_name, "Shane", :last_name, "Harvie"]]
所以在这里你会得到一个二维数组和 ''=> “”。
现在,让我们看看我们得到与图示*正在使用: -
[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
#=> [:first_name, "Shane", :last_name, "Harvie"]
在这里你会得到一维数组,所以图示造成内阵列出来的容器阵列。
所以Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
是相同的,以Hash[:first_name, "Shane", :last_name, "Harvie"]
#=> {:first_name=>"Shane", :last_name=>"Harvie"}
Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
我们能做的最好的事情是从内部开始,然后再向外。
在最里面的部分,你有两个数组,每个数组有两个元素: 一个符号和一个字符串。我们有一个数组包含这两个数组。
flatten
将使内部的两个数组扁平化,以便我们有一个包含元素的数组,而不是包含另外两个数组的数组。
星号(*)运算符将数组展开为函数中要使用的参数列表。
所以
[:first_name, 'Shane', :last_name, 'Harvie']
会变成
:first_name, 'Shane', :last_name, 'Harvie'
的最后一部分是哈希[]
其是需要的参数的阵列,并把它们的功能进入哈希。
{:first_name=>'Shane', :last_name=>'Harvie'}
瞧。它比首先看起来简单。
观察:
如果你看一看哈希的文件,你会看到,你可以有刚刚通过多个阵列凑[],它会照顾它。
参考文献:
-1。如果'*'将'[:first_name,'Shane',:last_name,'Harvie']'写成'[:first_name =>'Shane',:last_name =>'Harvie']'',但是符号' [:first_name =>'Shane',:last_name =>'Harvie']'表示数组中包含的散列,这意味着'*'本身就是将数组作为散列转换。这显然是错误的。 – sawa
另外你的**符号和文字(字符串)**不一致。它们是一个符号和一个字符串,都是文字。 – sawa
sawa:将解决不符合我的意思的标记原因。和符号/文字的东西。 – DallaRosa
是什么*指示呢? – Shane
@Shane这是[splat operator](http://www.jacopretorius.net/2012/01/splat-operator-in-ruby.html) –