用于计算字符串中的元音的函数

时间:2015-08-14 18:14:03

标签: ruby

为什么这不起作用?

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

4 个答案:

答案 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中,nilfalse被视为 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