2011-08-11 107 views
6

将范围1..10转换为以下格式的散列的最简单方法是什么?Ruby/Rails:将范围转换为散列

{ 
    1 => '£1', 
    2 => '£2', 
    # ... 
} 

我试图与map这样做,但散列的数组,而不是单一的散列结束。

谢谢。

回答

12
Hash[(1..10).map { |num| [num, "£#{num}"] }] 

(1..10).inject({}) { |hash, num| hash[num] = "£#{num}"; hash } 

或Ruby 1.9的

(1..10).each_with_object({}) { |num, hash| hash[num] = "£#{num}" } 
+1

方法,如'each_with_object'提醒我,我是多么爱红宝石! +1 –

+0

完美,谢谢! – gjb

+1

需要SWITCH | hash,num |到| num,hash |在最后一个例子中...否则得到NoM​​ethodError:undefined方法'[] ='为1:Fixnum – jpwynn

2

如何:

h = {} 
(1..10).each {|x| h[x] = "£#{x}"} 
+4

简单的经验法则 - 每次你声明一个空值(散列或数组),然后遍历集合来填充/求和它 - 使用'inject' – iafonov

+1

@ iafonov..for数组,你可以使用'map'。 – rubyprince

+0

@iafonov我意识到这是一个旧的帖子,但我看到了你的评论(我是Ruby的新手),它只是让我想知道为什么*你应该使用'inject'。我并不是说这是错的或什么,我只是想了解它背后的原因,因为上面的'each'方法很容易阅读和理解 - 据我了解,这项工作。 – Thor84no

1

另一种方式

h = Hash.new { |hash, key| hash[key] = "£#{key}" } 

每一个元素都会有相应的价值hovever也会给h[100]回应什么可能导致错误