我试图为英文字母的所有字母生成一个键/值对。不使用`to_h`方法创建Ruby哈希
在Ruby 2.1,我可以使用:
('a'..'z').each_with_index.to_h
# => { "a" => 0, "b" => 1, "c" => 2, ... }
然而,在红宝石1.9.x的,该to_h
方法不存在。这种情况的最佳解决方案是什么?
我试图为英文字母的所有字母生成一个键/值对。不使用`to_h`方法创建Ruby哈希
在Ruby 2.1,我可以使用:
('a'..'z').each_with_index.to_h
# => { "a" => 0, "b" => 1, "c" => 2, ... }
然而,在红宝石1.9.x的,该to_h
方法不存在。这种情况的最佳解决方案是什么?
您可以使用Hash constructor/factory method ::[],将键/值对作为两个元素数组传递。
Hash[ ('a'..'z').each_with_index.to_a ]
Hash[('a'..'z').zip(0..25)]
您可以压缩在一起过
你甚至可以省略多余的括号:'.zip(0..25)' – Stefan
因为'Range'是'Enumerable'和'Enumerable#zip'存在。不需要'#to_a'。 –
我接受尼尔斯莱特的第一个答案,但我喜欢这个简洁的答案:)谢谢! – professormeowingtons
使用图示操作:
=> Hash[[*[*'a'..'z'].map.with_index]]
=# {"a"=>0, "b"=>1, "c"=>2, "d"=>3, "e"=>4, "f"=>5, "g"=>6, "h"=>7......}
又一变:
Hash[(0..25).map { |i| [(97+i).chr, i] }]
您可以使用图示符(*
)太:
Hash[ *('a'..'z').each_with_index ]
要点澄清:'Enumerable#to_h'直到2.1才加入。 –