最佳選擇。
你有幾個問題;讓我們一次拿一個。第一:
undefined local variable or method `abcdefghijklmnopqrstuvwxyz'
當你寫的字符串,你需要用他們''
或""
。 Ruby正試圖將abcdefghijklmnopqrstuvwxyz
解釋爲變量,如letter
或stringarray
。所以這應該是這樣的:
disemvowel('abcdefghijklmnopqrstuvwxyz')
接下來,uninitialized constant A
。這是同樣的問題,發生在紅寶石試圖評估vowel_caps
和vowel_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
當說什麼會產生錯誤時,說出錯是什麼是個好主意。 –
...包括它發生的路線。 –