为什么这不起作用?
def count_vowels(string)
result = 0
i = 0
while i < string.length
if string[i] == "a" ||"e" || "i" || "o" || "u"
result = result + 1
i += 1
end
return result
end
答案 0 :(得分:3)
它不起作用,因为它永远是真的。 你当前的表达式被评估为(在单词中)这个字母是否相等?如果这是假的,那么&#34; e&#34;它没有评估第一个字母等于&#34; e&#34;它简单地评估为&#34; e&#34;。作为if语句,它等同于:
if string[i] == "a"
result += 1
i += 1
else
"e"
result += 1
i += 1
end
试试这个
%w(a e i o u).include?(string[i])
据说这样做会更容易
string.scan(/[aeiou]/i).count
然后你根本不需要循环
答案 1 :(得分:1)
首先,您的end
缺少if
。我想你想这样做(虽然不会给你正确答案):
def count_vowels(string)
result = 0
i = 0
while i < string.length
if string[i] == "a" ||"e" || "i" || "o" || "u"
result = result + 1
i += 1
end
end
return result
end
尝试使用这样的正则表达式执行此操作:
def count_vowels(string)
string.scan(/[aeouiAEIOU]/).count
end
/[aeouiAEIOU]/
是一个正则表达式,基本上表示任何这些字符:a, e, o, u, i, A, E, I, O, U
。
String#scan方法返回字符串中该正则表达式的所有匹配项,这意味着您将获得元音的数量!
答案 2 :(得分:1)
首先,除非您使用的是if
的后缀版本,否则它应该被end
括起来。又名:
if condition
action
end
其次,是什么
string[i] == "a" ||"e" || "i" || "o" || "u"
转换为:string[i] == "a"
或"e"
或"i"
或"o"
或"u"
。在Ruby中,nil
和false
被视为 falsey 值,其他一切都是 truthy 。
你真正的意思是
if ['a', 'e', 'i', 'o',' u'].include? string[i]
result += 1
end
<小时/> 但是,此时此代码非常像 C 。 Ruby为这些任务提供了更好的抽象级别。我建议调查String methods以找到一个更简单的解决方案。
答案 3 :(得分:0)
刚看到所有解决方案。我相信它们中的一些和我想象的一样好用。在一些答案中提出的问题之一是我在if语句中错过了结尾。这就是我所做的:
def count_vowels(string)
result = 0
i = 0
while i < string.length
if (string[i] == "a" || string[i] == "e" || string[i] == "i" || string[i] == "o" || string[i] == "u")
result = result + 1
end
i += 1
end
return result
end