2016-03-26 62 views
2

我想通過將字符串拆分爲一個字母數組然後映射元音字母到1並總結數組來計算字符串中元音的數量。映射函數返回數字0或1爲真或假

def count_vowels(string) 
    vowels = ['a','e', 'i', 'o', 'u'] 
    return string.split("").map{ |n| vowels.include? n ? 1 : 0}.inject(0,:+) 
end 

include?部分不正確返回10。任何建議爲什麼這不會飛?

我就砍死這個版本,它的工作原理,但看起來有點愚蠢:

def count_vowels(string) 
    vowels = ['a','e', 'i', 'o', 'u'] 
    return string.split("").map{ |n| vowels.include? n}.inject(0) do |mem,x| 
     x ? mem + 1 : mem 
    end 
end 
+5

'string.count(「aeiou」)' – steenslag

回答

6

原因:

string.split("").map{ |n| vowels.include? n ? 1 : 0}.inject(0,:+) 

行不通,是因爲n ? 1 : 0進行評估,作爲參數傳遞給include?而不是n。您需要在include?添加一些括號:

string.split("").map{ |n| vowels.include?(n) ? 1 : 0}.inject(0,:+) 

你可以簡單地做

def count_vowels(string) 
    vowels = ['a','e', 'i', 'o', 'u'] 
    string.split(//).select { |x| vowels.include? x }.length 
end 
+0

好的解釋。重新修改的方法,我建議:1'each_char'而不是'split(//)',2.'count'而不是'select/length'和3. steenslag的建議,而不是我的#1和#2。 –

+1

我想說幾乎所有涉及條件運算符的問題都是這樣說的:只要使用'if'代替它,它具有您期望的優先級,並且更具可讀性:'if vowels.include? n然後1其他0結束'。當然,無論如何添加括號是一個好主意(並且由大多數樣式指南推薦)。 –

+0

@JörgWMittag謝謝你的建議,我今天從字面上開始討論Ruby,所以我沒有弄清楚所有的語法。我知道js的三級運營商就這樣把它拿過來並且完美地解決了。你是正確的顯式關鍵字更具可讀性 – dedalux

0

在這種情況下,你需要include?方法參數括號。所以

return string.split("").map{ |n| vowels.include?(n) }.inject(0) do |mem,x| 

無論如何,你的代碼可能會更好

  • VOWELS = %w(a e i o u) # string's array
  • 你不需要在你的方法回報,這是最後陳述
  • string.split("") =>string.chars

請注意,您的方法可能如此:

def count_vowels(string) 
    string.count "aeiou" 
end 
1

您不需要map

def count_vowels(string) 
    vowels = %w[a e i o u] 
    string.chars.select{|n| vowels.include? n}.size 
end