2010-12-10 66 views
0

所以这是一个微不足道的,但希望有趣的问题。我需要使用与现有Hash的键相同的键和值创建Hash。这里是我最好的尝试沿着输入例子至今:如何使用哈希中的密钥创建一个新的哈希值,其中每个密钥的值都是密钥本身?

input = {'cat' => 'meow', 'dog' => nil} 
Hash[*input.keys.map {|k| [k,k]}.flatten] 
#=> {'cat' => 'cat', 'dog' => 'dog'} 

我不认为这是特别可读的,所以我想知道是否有使用Ruby这样做的更好,更具表现力的语法,特别是一个这对于维护代码的未来程序员来说可能更具可读性?

这是我会怎么做同样的事情在Python,我觉得这是稍微更具可读性:

dict([[a,a] for a in input]) 

但是,这可能仅仅是因为我已经习惯了阅读Python!

寻找适用于Ruby 1.8.6的建议,这是我所限制的版本。

+0

可能的重复[如何在Ruby中复制哈希?](http://stackoverflow.com/questions/4157399/how-do-i-copy-a-hash-in-ruby) – 2010-12-10 18:42:12

+0

输入和期望的输出表明我不会问如何复制散列,我将它转换为基于函数的新散列。我很乐意接受对这个问题标题的编辑,这会让这个问题变得更加清晰,但要简明扼要地表达,这是一个棘手的问题。 – Prairiedogg 2010-12-10 18:51:08

+0

“使用哈希中的键创建一个新的哈希,其中每个键的值都是自己的。” – zetetic 2010-12-10 19:00:08

回答

3
h = {'cat' => 'meow', 'dog' => nil} 
#=> {"cat"=>"meow", "dog"=>nil} 
Hash[h.keys.map{|k| [k,k]}] 
#=> {"cat"=>"cat", "dog"=>"dog"} 

下面是另一个,有点脏的方式(我认为它在1.8.6工作):

h.merge(h){|k,v,v| k} 
+0

优秀的答案,但我忘了提及我受限于红宝石1.8.6,显然没有这个'Hash'创建语法。你的答案在红宝石1.8.7中完美工作,但在红宝石1.8.6 – Prairiedogg 2010-12-10 18:46:14

+0

啊,我明白了。看看'backports'宝石,那么我会期待这样的功能被包含在那里。 – 2010-12-10 18:53:59

+0

它确实有效,而且简洁明了......什么是“脏”的呢?那里有一些我应该关注的陷阱吗? – Prairiedogg 2010-12-10 19:29:31

2
Hash[input.keys.zip(input.keys)] #=> {"cat"=>"cat", "dog"=>"dog"} 

或用注射:

input.keys.inject({}) { |h, k| h[k] = k ; h } #=> {"cat"=>"cat", "dog"=>"dog"} 

第二也在1.8.6工作。

相关问题