2012-04-13 80 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(' ')