使用此代码示例
#!/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
答案 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