将多个gsub语句重构为1

时间:2014-06-04 19:18:25

标签: ruby gsub

尝试将此重构为一行,以使字符串中的所有元音都大写。我尝试使用哈希,但失败了。尽管我尽最大努力查找它,但在Ruby上还是太新了解任何替代方案。类似...... str.gsub!(/aeiou/

def LetterChanges(str)
  str.gsub!(/a/, "A") if str.include? "a"
  str.gsub!(/e/, "E") if str.include? "e"
  str.gsub!(/i/, "I") if str.include? "i"
  str.gsub!(/o/, "O") if str.include? "o"
  str.gsub!(/u/, "U") if str.include? "u"
  puts str
end

2 个答案:

答案 0 :(得分:7)

最好的方法是

str.tr('aeiou', 'AEIOU')

String#tr

  

返回str的副本,from_str 中的字符替换为to_str中的相应字符。如果to_str比from_str短,则用最后一个字符填充它以保持对应关系。

答案 1 :(得分:3)

您可以使用gsub的第二个参数,即替换哈希:

str.gsub!(/[aeiou]/, 'a' => 'A', 'e' => 'E', 'i' => 'I', 'o' => 'O', 'u' => 'U')

或者,传递一个块:

str.gsub!(/[aeiou]/, &:upcase)

两者都将返回:

'this is a test'.gsub!(/[aeiou]/, 'a' => 'A', 'e' => 'E', 'i' => 'I', 'o' => 'O', 'u' => 'U')
# => "thIs Is A tEst"

'this is a test'.gsub!(/[aeiou]/, &:upcase)
# => "thIs Is A tEst"