2012-04-13 81 views
3

工作使用这个代码示例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优良”而不是“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

看下面我更新了。一行代码可以完成所有操作。 – texasbruce 2012-04-13 14:42:11

回答

4

当你GSUB你分配给它第一次使用paragrah

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

你第二次缺少作业

变化paragraph.gsub("x","ks")

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

或更改为'paragraph.gsub!(“x”,“ks”)' – megas 2012-04-13 13:39:12

+0

这是一个笨蛋,你是对的!关于第二种情况的任何想法似乎完全不同? – jaz9090 2012-04-13 13:40:32

0

如果你希望你的gsub是破坏性的,即以改变它被称为变量的值,使用gsub!。所以:

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

而不是:

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

它更简洁,而且Ruby开发者认识到爆炸方法破坏性(!)。而在你的情况,你需要在地方两个呼叫的gsub!方法gsub

+0

为什么word = word.gsub(“x”,“ks”)不起作用? – jaz9090 2012-04-13 13:42:25

+0

在第二个例子中有一个输入错误,不知道它是否会导致这个问题:'word [0.1] =“z”'不应该。做个,? – 2012-04-13 13:44:02

+0

似乎没有问题,修复它导致相同的输出 – jaz9090 2012-04-13 13:47:41

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

或者使用正则表达式(一条线操作能做到):

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

puts paragraph 
+0

不使用赋值运算符在我的代码中创建一个新的“单词”元素? – jaz9090 2012-04-13 13:48:04

+0

编号'obj.each'只能通过参考的“VALUE”(而不是通过引用;有点混淆,值得深入挖掘)。例如,'[1,2] .each {| x | x + = 1}'仍然会给出'[1,2]' – texasbruce 2012-04-13 13:54:43

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(' ')