2017-08-17 70 views
-1

我想返回給定字符串參數中存在的元音量。這是我的代碼:Ruby'each'方法看起來不起作用

def count_vowels(string) 
    new = string.split("") 
    number_of_vowels = 0 
    new.each do |letters| 
    if letters = "a" || letters = "e" || letters = "i" || letters = "o" || letters = "u" || 
     numbers_of_vowels = number_of_vowels + 1 
    end 
    end 
    number_of_vowels 
end 

對於任何參數,number_of_vowels回報0。有什麼建議麼?

+0

請正確格式的代碼。格式錯誤的代碼非常難以閱讀。 –

+0

編輯。抱歉!! – Stevecane

+3

更好!現在,你認爲那裏有'||'在做什麼? –

回答

2

您需要檢查與==是否相等。 =只是分配。

這裏 - if letters = "a" ||應該是if letters == "a" ||

其餘部分相同。


工作代碼 -

def count_vowels(string) 
    new = string.split("") 
    number_of_vowels = 0 
    new.each {|letters| number_of_vowels += 1 if letters == "a" || letters == "e" || letters =="i" || letters == "o" || letters == "u"} 
    number_of_vowels 
end 

演示here

+0

將其更改爲==,但似乎我仍然得到0的回報。感謝您的快速回復,非常感謝。 – Stevecane

+0

@Stevecane查看更新的答案。添加了工作代碼。 –

+0

'i = 0; collection.each {| e | i + = 1 if ...};我是這樣一個常見的模式,Ruby有一個方法:['Enumerable#count'](http://ruby-doc.org/core-2.4.1/Enumerable。HTML#方法-I-數) – Stefan

2

你的代碼有三個問題。

首先,您在循環內的變量number_of_vowels中有錯字。在那裏,您將計數器遞增到numbers_of_vowels,但從不再使用該變量(複數爲numbers)。相反,您返回number_of_vowels(單數number)仍然是0

其次,=letters = "a"分配"a"給變量a什麼會回來truish所有的時間。使用==來比較兩個值是否相等。

第三,在if條件結尾處有一個孤兒||。什麼導致下列行成爲條件的一部分。由於第一個子句已經返回真的,所以計算從不計算。

這是一個固定的版本可能看起來怎麼樣:

def count_vowels(string) 
    new = string.split("") 
    number_of_vowels = 0 

    new.each do |letters| 
    if letters == "a" || letters == "e" || letters == "i" || letters == "o" || letters == "u" 
     number_of_vowels = number_of_vowels + 1 
    end 
    end 

    number_of_vowels 
end 

此外,你可能要簡化你的代碼位:

# Appending an `i` to this regexp would enable case-insensitive 
# matching and would find upper-case characters too. 
VOWELS = /[aeiou]/ 

def count_vowels(string) 
    string.scan(VOWELS).size 
end 
+0

'numbers_of_vowels'和'number_of_vowels' - 現貨:-) – Stefan

+0

@Stefan的區別:謝謝你,我錯過了細節。 – spickermann

+1

一個很好的例子爲什麼'number_of_vowels + = 1'應該被使用。 – Stefan