我想更改散列中的每个值,以便在值之前和之后添加'%'
{ :a=>'a' , :b=>'b' }
Run Code Online (Sandbox Code Playgroud)
必须改为
{ :a=>'%a%' , :b=>'%b%' }
Run Code Online (Sandbox Code Playgroud)
最好的方法是什么?
sho*_*one 254
在Ruby 2.1及更高版本中,您可以做到
{ a: 'a', b: 'b' }.map { |k, str| [k, "%#{str}%"] }.to_h
Run Code Online (Sandbox Code Playgroud)
Phr*_*ogz 168
如果您希望实际的字符串本身在适当的位置发生变异(可能并且希望影响对相同字符串对象的其他引用):
# Two ways to achieve the same result (any Ruby version)
my_hash.each{ |_,str| str.gsub! /^|$/, '%' }
my_hash.each{ |_,str| str.replace "%#{str}%" }
Run Code Online (Sandbox Code Playgroud)
如果您希望哈希值就地更改,但您不想影响字符串(您希望它获取新字符串):
# 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 }
Run Code Online (Sandbox Code Playgroud)
如果你想要一个新的哈希:
# 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}%"] } ]
Run Code Online (Sandbox Code Playgroud)
ssc*_*eck 98
Ruby 2.4引入了Hash#transform_values!您可以使用的方法.
{ :a=>'a' , :b=>'b' }.transform_values! { |v| "%#{v}%" }
# => {:a=>"%a%", :b=>"%b%"}
Run Code Online (Sandbox Code Playgroud)
Sim*_*Sim 80
修改哈希值的最佳方法是
hash.update(hash){ |_,v| "%#{v}%" }
Run Code Online (Sandbox Code Playgroud)
更少的代码和明确的意图.也更快,因为除了必须更改的值之外没有分配新对象.
edg*_*ner 28
更可读的一个,map它是一个单元素哈希数组和reduce那个merge
the_hash.map{ |key,value| {key => "%#{value}%"} }.reduce(:merge)
Run Code Online (Sandbox Code Playgroud)
wot*_*oto 17
这项任务有一种新的'Rails方法':) http://api.rubyonrails.org/classes/Hash.html#method-i-transform_values
小智 16
一种不会对原件产生副作用的方法:
h = {:a => 'a', :b => 'b'}
h2 = Hash[h.map {|k,v| [k, '%' + v + '%']}]
Run Code Online (Sandbox Code Playgroud)
Hash #map也可能是一个有趣的读物,因为它解释了为什么Hash.map不返回Hash(这就是为什么生成的[key,value]对数组被转换为新的Hash)并为相同的一般模式提供替代方法.
快乐的编码.
[免责声明:我不确定Hash.mapRuby 2.x中的语义是否会发生变化]
And*_*all 15
my_hash.each do |key, value|
my_hash[key] = "%#{value}%"
end
Run Code Online (Sandbox Code Playgroud)
小智 7
Hash.merge!是最干净的解决方案
o = { a: 'a', b: 'b' }
o.merge!(o) { |key, value| "%#{ value }%" }
puts o.inspect
> { :a => "%a%", :b => "%b%" }
Run Code Online (Sandbox Code Playgroud)
用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
Run Code Online (Sandbox Code Playgroud)
您可以按如下方式实现Hash#map_values:
class Hash
def map_values
Hash[map { |k, v| [k, yield(v)] }]
end
end
Run Code Online (Sandbox Code Playgroud)
然后可以使用这个函数:
{:a=>'a' , :b=>'b'}.map_values { |v| "%#{v}%" }
# {:a=>"%a%", :b=>"%b%"}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
130477 次 |
| 最近记录: |