gsub在整个代码段中无法正常工作

时间:2012-04-13 13:32:51

标签: ruby gsub

使用此代码示例

#!/usr/bin/ruby
paragraph = "champion xylophone excellent"
paragraph = paragraph.gsub("ch","tj")
words = paragraph.split(/ /)
words.each do |word|
   if word[0,1] == "x"
     word[0.1] = "z" 
   end
end
paragraph = words.join(" ")
paragraph.gsub("x","ks")
print paragraph

输出将是'tjampion zylophone excellent'而不是'tjampion zylophone ekscellent'

如果将gsub应用于各个单词中,则同样适用。我不明白为什么它在开始时起作用而不是在最后起作用。

修改

第二种情况与第一种情况不同:

#!/usr/bin/ruby
paragraph = "champion xylophone excellent"
paragraph = paragraph.gsub("ch","tj")
words = paragraph.split(/ /)
words.each do |word|
   if word[0,1] == "x"
     word[0.1] = "z" 
   end
   word = word.gsub("x","ks")
end
paragraph = words.join(" ")
print paragraph

4 个答案:

答案 0 :(得分:5)

当您第一次使用gsub时,您将其分配给段落

paragraph = paragraph.gsub("ch","tj")

第二次错过作业

paragraph.gsub("x","ks")更改为

paragraph = paragraph.gsub("x","ks")

答案 1 :(得分:2)

paragraph.gsub!("x","ks")
puts paragraph

或者使用RegEx(一行操作可以完成所有操作):

paragraph = "champion xylophone excellent"
paragraph = paragraph.gsub("ch","tj").gsub(/([\A\s])x(\w*)/){$1 + 'z'+ $2}.gsub("x","ks")

puts paragraph

答案 2 :(得分:2)

您的代码无意中正在运行。工作部件使用修改字符串的字符串的方法;不工作的部分使用产生新字符串的方法(被丢弃)。这令人困惑;如果所需结果是数组,则更好的方法是使用map。它将包含块的结果,无论是修改后的字符串还是新的字符串。

paragraph = "champion xylophone excellent"
words = paragraph.split(' ').map do |word|
  word.gsub('ch','tj') #new string
  word[0.1] = "z" if word.start_with?('x') #modified string
  word.gsub!('x','ks') #modified string
end
puts words.join(' ')

答案 3 :(得分:0)

如果您希望gsub具有破坏性,即更改调用它的变量的值,请使用gsub!。这样:

paragraph.gsub!('ch', 'tj')

而不是:

paragraph = paragraph.gsub('ch', 'tj')

它更简洁,Ruby开发人员认为bang(!)方法具有破坏性。在您的情况下,您需要使用gsub!方法代替对gsub

的两次调用