修改键和值

你可以创建一个新的哈希值,修改了键或值,实际上你也可以使用 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"}

哈希是一个可枚举的,实质上是键/值对的集合。因此有 eachmapinject 等方法。

对于散列中的每个键/值对,评估给定块,第一次运行的备忘录值是传递给 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] }]

(有关更多详细信息,请参阅此答案 ,包括如何操作哈希值。)