2016-03-08 38 views
0

我練習用X替換字符串中的任何元音。以下內容返回錯誤。我不知道爲什麼。我不想用String#replace替換字符串中的所有元音

def disemvowel (string) 
    vowels_caps = [A, E, I, O, U] 
    vowels_notcaps = [a, e, i, o, u] 

    stringarray = string.split("") 

    stringarray.each do |letter| 
    if vowels_caps.include? letter or vowels_notcaps.include? letter 
     letter = "X" 
    end 
    end 

    string = stringarray.join("") 

    string 
end 

disemvowel(abcdefghijklmnopqrstuvwxyz) 
+4

當說什麼會產生錯誤時,說出錯是什麼是個好主意。 –

+0

...包括它發生的路線。 –

回答

2

它應該是這樣簡單。使用方法名的String#tr

'abcdefghijklmnopqrstuvwxyz'.tr('aeiouAEIOU', 'X') 
#=> "XbcdXfghXjklmnXpqrstXvwxyz" 

'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.tr('aeiouAEIOU', 'X') 
#=> "XBCDXFGHXJKLMNXPQRSTXVWXYZXbcdXfghXjklmnXpqrstXvwxyz" 
+3

雖然這是一個適當的解決方案,但它並不回答爲什麼上述代碼不起作用的問題。 –

2
str = "abcdefghijklmnopqrstuvwxyz" 
str.gsub(/[aeiou]/i, 'x') 
# => "xbcdxfghxjklmnxpqrstxvwxyz" 
+2

儘管這是練習的工作解決方案,但它並沒有回答上述代碼無法工作的問題。您可以通過使您的正則表達式不區分大小寫('/ [aeiou]/i')來跳過'downcase'。 –

8

最佳選擇。

你有幾個問題;讓我們一次拿一個。第一:

undefined local variable or method `abcdefghijklmnopqrstuvwxyz' 

當你寫的字符串,你需要用他們''""。 Ruby正試圖將abcdefghijklmnopqrstuvwxyz解釋爲變量,如letterstringarray。所以這應該是這樣的:

disemvowel('abcdefghijklmnopqrstuvwxyz') 

接下來,uninitialized constant A。這是同樣的問題,發生在紅寶石試圖評估vowel_capsvowel_notcaps

vowels_caps = ['A', 'E', 'I', 'O', 'U'] 

創建的字符串數組是常見的,所以有使用%w的簡寫,可以輕鬆地創建字數組,用空格分隔:

vowels_caps = %w[A E I O U] 
vowels_notcaps = %w[a e i o u] 

現在你運行腳本,但看起來沒有任何反應。確保你打印你的輸出:

puts disemvowel('abcdefghijklmnopqrstuvwxyz') 

好,所以有一些輸出,但它只是再次的字母表。這裏的失敗是,您希望letter = "X"替換stringarray中的字母,但它不會。 letter是它自己的變量,與stringarray無關 - 它不是指向數組本身的指針。有幾種方法可以解決這個問題,但我認爲最明顯的可能是從each切換到map,因爲您已經在嘗試join之後的結果。 each返回原始數組,map返回一個包含每次迭代結果的數組。

resultarray = stringarray.map do |letter| 
    if vowels_caps.include? letter or vowels_notcaps.include? letter 
    "X" 
    else 
    letter 
    end 
end 
puts resultarray.inspect 

我只是把那打印有暫時以驗證確實X被塗膠在每個元音:

["X", "b", "c", "d", "X", "f", "g", "h", "X", "j", "k", "l", "m", "n", "X", "p", "q", "r", "s", "t", "X", "v", "w", "x", "y", "z"] 

作爲一個側面說明,這可以偶爾發動戰爭的東西 - 您應該更喜歡||而不是布爾邏輯中的or。運營商have different precedence和使用or這種方式can surprise you

if vowels_caps.include?(letter) || vowels_notcaps.include?(letter) 

現在只要join它備份就像你一直,實際上沒有必要重新分配給string。Ruby返回函數中最後一個表達式的值,它可以是:

resultarray.join("") 

並且瞧!

$ ruby disemvowel.rb 
XbcdXfghXjklmnXpqrstXvwxyz 
+0

很好的答案。你認爲在這種情況下在地圖上使用'!'操作符是一個壞主意? –

+2

完全不是,只取決於你想要的。我犯的是非破壞性的操作符,但是如果字符串/數組非常長,使用'map!'來避免構建第二個數組將會是有益的。 –

+0

你是一個了不起的英雄!非常感謝您的詳細回覆。我學到了很多! –