2014-04-01 74 views
0

任何人都可以解释我如何将数组转换为Hash吗?将数组转换为散列

puts Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten] 

我不理解什么happens当我们调用Hash[*[]]].flatten]后面。

回答

2

你只需要做:

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"]] 

如果你确实使用splatfaltten,那么你会得到如下:

[*[[: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]就足够了。

+0

是什么*指示呢? – Shane

+0

@Shane这是[splat operator](http://www.jacopretorius.net/2012/01/splat-operator-in-ruby.html) –

1

首先阵列被压扁:

[[: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阵列。

2

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']]] 
1

我们得到什么,而无需使用图示*的: -

[[[: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"} 
1
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'}

瞧。它比首先看起来简单。

观察:

如果你看一看哈希的文件,你会看到,你可以有刚刚通过多个阵列凑[],它会照顾它。

参考文献:

+0

-1。如果'*'将'[:first_name,'Shane',:last_name,'Harvie']'写成'[:first_name =>'Shane',:last_name =>'Harvie']'',但是符号' [:first_name =>'Shane',:last_name =>'Harvie']'表示数组中包含的散列,这意味着'*'本身就是将数组作为散列转换。这显然是错误的。 – sawa

+1

另外你的**符号和文字(字符串)**不一致。它们是一个符号和一个字符串,都是文字。 – sawa

+0

sawa:将解决不符合我的意思的标记原因。和符号/文字的东西。 – DallaRosa