2014-01-11 21 views
1

因此,我試圖找到一種方法來由用戶輸入唐老鴨 - ify語句(稍後判斷我)。Ruby:「未定義的方法」錯誤;如何更有效地使用gsub?

這是我到目前爲止的代碼:

puts "Wanna get Donald Duck-ified?" 
print "Type some text here:" 
user_input = gets.chomp 

if user_input.gsub!(/s/,"th").gsub!(/ce/,"th").gsub!(/ci/,"th").gsub!(/cy/,"th") 
    puts "Boop - there go your s's and soft c's!" 
else 
    puts "Dang, you didn't have any s's or soft c's!" 
end 

puts "#{user_input}" 

在我自己的一些輸入測試它(「方形週期凱撒圈」,特別是),我得到「未定義的方法`GSUB「!爲零:NilClass「作爲錯誤。

如何GSUB!未定義?如果代碼自己使用user_input.gsub!(/s/,"th")運行,而沒有其他任何方法,它就可以正常工作。一旦添加了第二種方法,else代碼就會運行,並且只會替換「s」。所有四個,我得到上面的錯誤。

是否有發生與單個替換替換多個模式(如命名爲Ruby的文檔)的另一種方式?我花了最後幾個小時來研究這個問題,但我仍然無法完全知道問題所在。

新的紅寶石。鼓勵和動力。 非常感謝提前。

回答

2

不要使用#gsub!鏈。 (實際上,使用#gsub!在所有的大多數代碼。)

[GSUB!]執行字符串#GSUB 到位換人,返回海峽,或零如果沒有換人了執行。

切換代碼#gsub不會引起副作用(!耶),總是返回一個字符串(耶!) - 簡單地比較原始(未修改)字符串的結果。


此外,人們可以使用接受散列(因爲Ruby 1.9.something)的gsub形式。這有一個微妙的區別,即替換值不會被自己替換,儘管在這裏並不重要。

user_input.gsub(/s|ce|ci|cy/, { "s"=>"th", "ce"=>"th", "ci"=>"th", "cy"=>"th" }) 
# or since all are replaced with "th" (which I just noticed =^_^=) .. 
user_input.gsub(/s|ce|ci|cy/, "th") 

(我還是建議不要gsub!,因爲我覺得在串令人不安的副作用。然而,上面與非連鎖的形式使用時,它會可靠地工作。)

+0

雙方你例子 - 特別是第二個 - 正是我一直試圖做的這一切!他們也工作過,儘管我在方法前加了'!'。我一定會在未來的時候記住你的建議。我現在有另一個困境:我有這個集合取代「ci/ce/cy」,因爲「circle」會給我「thrcle」,哈哈。現在要弄清楚如何識別以「ci」開頭的單詞和僅替換「c」的單詞。當你解決了一個,一個又一個,哈哈。感謝您的幫助:) –

+1

@adamantly_so正則表達式中的單詞邊界錨將是'\ b'。 –

2

Ruby的gsub!回報nil如果執行沒有替換。這意味着你不能像你一樣可靠地鏈接它。如果您想驗證任何gsub S的所做的任何改變,你可以鏈無損gsub S(沒有爆炸;返回而不是修改當前的一個新的字符串),而不是:

input = gets.chomp 
replaced = input.gsub(/s/,"th").gsub(/ce/,"th").gsub(/ci/,"th").gsub(/cy/,"th") 
if input == replaced 
    ... 
+0

不錯的驗證方法。在我繼續使用gsub時,我會非常明確地記住這一點。謝謝! –

相關問題