在Ruby中更改散列中的每個值


Answers

在Ruby 2.1及更高版本中,您可以做到

{ a: 'a', b: 'b' }.map { |k, str| [k, "%#{str}%"] }.to_h
Question

我想改變散列中的每個值,以便在值的前後添加'%'

{ :a=>'a' , :b=>'b' }

必須改為

{ :a=>'%a%' , :b=>'%b%' }

什麼是最好的方法來做到這一點?




使用RSpec進行測試後,如下所示:

describe Hash do
  describe :map_values do
    it 'should map the values' do
      expect({:a => 2, :b => 3}.map_values { |x| x ** 2 }).to eq({:a => 4, :b => 9})
    end
  end
end

你可以如下實現Hash#map_values:

class Hash
  def map_values
    Hash[map { |k, v| [k, yield(v)] }]
  end
end

該功能可以像這樣使用:

{:a=>'a' , :b=>'b'}.map_values { |v| "%#{v}%" }
# {:a=>"%a%", :b=>"%b%"}



my_hash.each do |key, value|
  my_hash[key] = "%#{value}%"
end



一種不會引入原始副作用的方法:

h = {:a => 'a', :b => 'b'}
h2 = Hash[h.map {|k,v| [k, '%' + v + '%']}]

Hash#map也可能是一個有趣的讀​​取,因為它解釋了為什麼Hash.map不返回Hash(這就是為什麼[key,value]對的結果數組被轉換為新的Hash),並提供了替代方法相同的一般模式。

快樂的編碼。

[免責聲明:我不確定在Ruby 2.x中Hash.map語義是否更改]




Ruby 2.4引入了方法Hash#transform_values! ,你可以使用它。

{ :a=>'a' , :b=>'b' }.transform_values! { |v| "%#{v}%" }
# => {:a=>"%a%", :b=>"%b%"} 



Related



Tags

ruby ruby   hash