Ruby on rails Ruby gsub字符串中的多个字符

Ruby on rails Ruby gsub字符串中的多个字符,ruby-on-rails,ruby,Ruby On Rails,Ruby,使用Ruby 1.9.3和Rails 3.2,我有以下几点: "every good boy does fine".gsub("every", "all").gsub("boy", "girl").gsub("fine", "well") # => "all good girl does well" 有没有更好的方法写这个?谢谢 replacements = [ ["every", "all"], ["boy", "girl"],["fine", "well"] replacements

使用Ruby 1.9.3和Rails 3.2,我有以下几点:

"every good boy does fine".gsub("every", "all").gsub("boy", "girl").gsub("fine", "well")
# => "all good girl does well"
有没有更好的方法写这个?谢谢

replacements = [ ["every", "all"], ["boy", "girl"],["fine", "well"]
replacements.each {|replacement| str.gsub!(replacement[0], replacement[1])}
我不知道它是否更好,但是更干净。

这将是很好的选择

a = "every good boy does fine"
h = {"every" => "all","boy" => "girl", "fine" =>"well" }
a.gsub(/\w+/) { |m| h.fetch(m,m)}
# => "all good girl does well"
或者


如果目的是避免方法链接:

[9] pry(main)> "every good boy does fine".gsub("every", "all").gsub("boy", "girl").gsub("fine", "well")
=> "all good girl does well"
[10] pry(main)> "every good boy does fine".gsub(/(every)|(boy)|(fine)/) do |word|
[10] pry(main)*   case word
[10] pry(main)*   when "every"
[10] pry(main)*     "all"
[10] pry(main)*   when "boy"
[10] pry(main)*     "girl"
[10] pry(main)*   when "fine"
[10] pry(main)*     "well"
[10] pry(main)*   end
[10] pry(main)* end
=> "all good girl does well"
或者:

[11] pry(main)> REPLACEMENT = { "every" => "all", "boy" => "girl", "fine" => "well"}
=> {"every"=>"all", "boy"=>"girl", "fine"=>"well"}
[12] pry(main)> "every good boy does fine".gsub(/(every)|(boy)|(fine)/) { |word| REPLACEMENT[word] }
=> "all good girl does well"
只要这样做:

“每个好男孩都做得很好”。gsub(/\w+/,“每个”=>“所有”,“男孩”=>“女孩”,“好”=>“很好”)

更容易阅读:) 这个简单问题的一些答案真的让我好奇…哈哈

以下是参考资料:


gg

subs[m]| | m
远远好于
h.has_key?(m)?h[m]:m
。。我忘了,但你提醒我:)
subs.default\u proc=->(h,k){k}
是另一个选项,那么你可以说
{m | subs[m]}
并隐藏
default\u proc
@muistooshort More better is
a.gsub(/\w+/){m | h.fetch(m,m)}
:)看看我的编辑。巧妙地使用了
Regexp union
,但是
'no-finerboy(Regexp.union(*h.keys),h)
->
“没有好女孩”
我发现我最初的方法虽然不是最好的,但更具可读性。不过,感谢您的指导。:)
[11] pry(main)> REPLACEMENT = { "every" => "all", "boy" => "girl", "fine" => "well"}
=> {"every"=>"all", "boy"=>"girl", "fine"=>"well"}
[12] pry(main)> "every good boy does fine".gsub(/(every)|(boy)|(fine)/) { |word| REPLACEMENT[word] }
=> "all good girl does well"
subs = { "every" => "all", "boy" => "girl", "fine" => "well" }
"every good boy does fine".gsub(/\w+/) { |m| subs[m] || m }
# => 'all good girl does well'