hash hash寫法 - 在Ruby中更改散列中的每個值





hash取值 rails (10)


更可讀一個, mapmap到單元哈希數組,並通過merge reduce

the_hash.map{ |key,value| {key => "%#{value}%"} }.reduce(:merge)

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

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

必須改為

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

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




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



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

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



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

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



Hash.merge! 是最乾淨的解決方案

o = { a: 'a', b: 'b' }
o.merge!(o) { |key, value| "%#{ value }%" }

puts o.inspect
> { :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%"}



如果你想讓實際的字符串本身在適當的位置進行變異(可能並希望影響對相同字符串對象的其他引用):

# Two ways to achieve the same result (any Ruby version)
my_hash.each{ |_,str| str.gsub! /^|$/, '%' }
my_hash.each{ |_,str| str.replace "%#{str}%" }

如果你希望哈希值改變,但你不想影響字符串(你希望它得到新的字符串):

# Two ways to achieve the same result (any Ruby version)
my_hash.each{ |key,str| my_hash[key] = "%#{str}%" }
my_hash.inject(my_hash){ |h,(k,str)| h[k]="%#{str}%"; h }

如果你想要一個新的散列:

# Ruby 1.8.6+
new_hash = Hash[*my_hash.map{|k,str| [k,"%#{str}%"] }.flatten]

# Ruby 1.8.7+
new_hash = Hash[my_hash.map{|k,str| [k,"%#{str}%"] } ]






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

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語義是否更改]




crypto模塊使這非常簡單。

建立:

const crypto = require('crypto');

const sha256 = x => crypto.createHash('sha256').update(x, 'utf8').digest('hex');

用法:

sha256('Hello, world. ');




ruby hash