我不知道这是否是散列问题或阵列问题,但是我不明白为什么要在第三个例子中使用星号(*)符号来获取填充数据的哈希.没有它,它输出一个空的哈希.
# -*- coding: utf-8 -*- require 'pp' pp [[:first_name,'Shane'],[:last_name,'Harvie']] # => [[:first_name,"Shane"],"Harvie"]] pp [[:first_name,'Harvie']].flatten # => [:first_name,"Shane",:last_name,"Harvie"] pp Hash[*[[:first_name,'Harvie']].flatten] # => {:first_name=>"Shane",:last_name=>"Harvie"} pp Hash[[[:first_name,'Harvie']].flatten] # => {}
以下是该方法的说明.
--------------------------------------------------------------- Hash::[] Hash[ [key =>|,value]* ] => hash From Ruby 1.8 ------------------------------------------------------------------------ Creates a new hash populated with the given objects. Equivalent to the literal +{ _key_,_value_,... }+. Keys and values occur in pairs,so there must be an even number of arguments. Hash["a",100,"b",200] #=> {"a"=>100,"b"=>200} Hash["a" => 100,"b" => 200] #=> {"a"=>100,"b"=>200} { "a" => 100,"b" => 200 } #=> {"a"=>100,"b"=>200}
解决方法
splat操作符(即*)会将一个数组转换成一个列表,以便在散列中进行分配.你必须给[]运算符一个实际的列表,以转换成一个哈希的键/值对. (请参阅下文链接到实际可以执行此操作的Splat操作符的简短描述(将数组放入列表)或反向(将列表收集到数组中).)
你上面的方式,你给Hash []一个奇数的项目,即单个数组. (想想什么[[:first_name,’Shane’],[:last_name,’Harvie’]].flatten生成,它产生[:first_name,’Shane’,last_name,’Havie’])作为文档引用说,[]运算符必须有偶数个元素.请注意,以下(虽然没用)确实有效:
>> Hash[[[:first_name,'Harvie']].flatten,1] => {[:first_name,"Harvie"]=>1}
(我不明白为什么在使用上面的代码时,您不会得到“奇数数目的哈希参数”错误 – 如果您尝试使用Hash [1]).
一个更简单的例子可能会更清楚.首先,传入一个项目,一个数组.用*打开数组用哈希[]列表项:
>> Hash[['foo','bar','bizz','buzz']] => {} >> Hash[*['foo','buzz']] => {"foo"=>"bar","bizz"=>"buzz"}
请参阅this blog post以获得更全面的解释.您也可能会发现this short write-up about the splat operator有用.