任何人都可以解释一下如何将数组转换为Hash
吗?
puts Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
当我们致电happens
时,我不明白Hash[*[]]].flatten]
背后的原因。
答案 0 :(得分: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"]]
如果你确实使用 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]
就足够了。
答案 1 :(得分:2)
Hash
类定义方法[]
。此方法接受任意数量的参数,获取每对并创建一个新哈希,每对的第一个元素是键,第二个元素是值。如果你传递奇数量的ov参数,这将失败。它还允许您传递2d数组或任意数量的2个元素数组。
现在你有了2d数组:[[:first_name, 'Shane'], [:last_name, 'Harvie']]
。当您调用flatten时,将所有内部数组合并为一个:
Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
Hash[[:first_name, 'Shane', :last_name, 'Harvie']]
现在,如果使用splat运算符,则提取所有元素并将它们作为单独的参数传递给[]
方法,因此转换为:
Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
Hash[:first_name, 'Shane', :last_name, 'Harvie']
但请注意,不需要它 - Hash[]
可以处理初始表单。只是做:
Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']]]
答案 2 :(得分:1)
首先将数组展平:
[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten
# becomes: [:first_name, 'Shane', :last_name, 'Harvie']
由于Hash#[]
method接受任意数量的参数,如此
Hash['a', 'b', 'c', 'd']
而不是数组,你需要使用splat运算符(*
)来扩展堆栈上的数组,以便将值用作参数
Hash[*[:first_name, 'Shane', :last_name, 'Harvie']]
# becomes: Hash[:first_name, 'Shane', :last_name, 'Harvie']
Arup是对的,你不需要展平,因为Hash#[]
方法也接受2d数组。
答案 3 :(得分:1)
我们在不使用splat *的情况下得到的结果: -
[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
#=> [[:first_name, "Shane", :last_name, "Harvie"]]
所以在这里你得到一个2D数组和''=> “”。
现在,让我们看看我们使用splat *得到了什么: -
[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
#=> [:first_name, "Shane", :last_name, "Harvie"]
这里有1D数组,因此splat导致内部数组从容器数组中出来。
因此Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
与Hash[:first_name, "Shane", :last_name, "Harvie"]
#=> {:first_name=>"Shane", :last_name=>"Harvie"}
答案 4 :(得分:1)
Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
我们能做的最好的事情就是从内部开始,然后向外走。
在最里面的部分,你有两个数组,每个数组有两个元素: 符号和字符串。
要使用下一组括号,我们有一个包含这两个数组的数组。
flatten
将内部的两个数组变平,这样我们就有一个数组包含元素,而不是包含另外两个数组的数组。
star(*)运算符,将数组扩展为要在函数中使用的参数列表。
所以
[:first_name, 'Shane', :last_name, 'Harvie']
将变成
:first_name, 'Shane', :last_name, 'Harvie'
最后一部分是Hash []
这是一个函数,它接受一组参数并将它们变成一个哈希。
{:first_name=>'Shane', :last_name=>'Harvie'}
瞧。它比起初看起来更简单。
<强>观察:强>
如果你看一下Hash的文档,你会发现你可能刚刚将多个数组传递给了Hash []并且会处理它。
<强>参考文献:强>