修改键和值
你可以创建一个新的哈希值,修改了键或值,实际上你也可以使用 inject (AKA, reduce ) 添加或删除键。例如,使用字符串化键和大写值生成哈希:
fruit = { name: 'apple', color: 'green', shape: 'round' }
# => {:name=>"apple", :color=>"green", :shape=>"round"}
new_fruit = fruit.inject({}) { |memo, (k,v)| memo[k.to_s] = v.upcase; memo }
# => new_fruit is {"name"=>"APPLE", "color"=>"GREEN", "shape"=>"ROUND"}
哈希是一个可枚举的,实质上是键/值对的集合。因此有 each
,map
和 inject
等方法。
对于散列中的每个键/值对,评估给定块,第一次运行的备忘录值是传递给 inject
的种子值,在我们的例子中是空散列,{}
。memo
用于后续评估的值是前一个块评估的返回值,这就是我们通过设置一个带有值的键来修改 memo
然后在结尾处返回 memo
的原因。最终块评估的返回值是 inject
的返回值,在我们的例子中是 memo
。
为了避免必须提供最终值,你可以使用 each_with_object :
new_fruit = fruit.each_with_object({}) { |(k,v), memo| memo[k.to_s] = v.upcase }
甚至是地图 :
Version >= 1.8
new_fruit = Hash[fruit.map{ |k,v| [k.to_s, v.upcase] }]
(有关更多详细信息,请参阅此答案 ,包括如何操作哈希值。)