无法简化`if`语句条件

时间:2015-04-24 14:09:56

标签: ruby

这是一个用if语句计算字符串中包含的元音的函数:

 def count_vowels(string)
 sum = 0
  n = 0
  while n < string.length
    if string[n] == "a"||string[n]=="i"||string[n]=="u"||string[n]=="e"||string[n]=="o"
      sum += 1
    end
    n+=1
  end
  return sum
end

我发现重复的string[n] ==是多余的,并将其替换为:

if string[n] == ("a"||"i"||"u"||"e"||"o")

但是,在此代码中,该函数不会返回正确的计数。为什么简化的if语句在这里不起作用?

6 个答案:

答案 0 :(得分:4)

它不起作用,因为a == (x || y) 扩展为a == x || a == y

而是将a(x || y)的结果进行比较。

if string[n] == ("a"||"i"||"u"||"e"||"o")

相当于:

if string[n] == "a"

,因为:

("a"||"i"||"u"||"e"||"o") #=> "a"

如果您想简化代码,请使用count

def count_vowels(string)
  string.count('aeiou')
end

答案 1 :(得分:2)

回答你的问题

string[n] == ("a"||"i"||"u"||"e"||"o")

此部分("a"||"i"||"u"||"e"||"o")将始终评估为"a"

所以你基本上是在写

string[n] == "a"

更好的方法可能是

def count_vowels(my_string)
  mystring.chars.count{ |c| c  =~ /[aeiou]+/i }
end

您还可以扩展字符串类以获得乐趣

class String
  def vowels_count
    chars.count{ |c| c  =~ /[aeiou]+/i }
  end
end

答案 2 :(得分:1)

有多种方法可以做你想要的但是它不起作用的原因是因为ruby评估了("a"||"e"||"i"||"o"||"u")以返回那些不是false或{的第一个字符{1}}。基本上,总是的子句返回nil

"a"

这意味着您始终在测试2.2.1 :001 > ("a"||"e"||"i"||"o"||"u") => "a" 是否明显不符合您的目标。

答案 3 :(得分:0)

它不会返回正确的计数,因为||中的if string[n] == ("a"||"i"||"u"||"e"||"o")会计算出第一个非错误条件,在这种情况下为"a"(它不是nilfalse),所以基本上与if string[n] == "a"相同。您可以尝试使用include?

%w( a i u e o).include? string[n]

in?

string[n].in? %w( a i u e o)

答案 4 :(得分:0)

添加常规表现

 def count_vowels(string)
 sum = 0
  n = 0
  while n < string.length
    if string[n] =~ /[aiueo]/ # will match a, i, u, e or o
      sum += 1
    end
    n+=1
  end
  return sum
end

您甚至可以更简化代码

def count_vowels(string)
  string.split('').select{|char| char =~ /[aeiou]/}.length
end

将执行相同的功能

  string.split('')

会给你一系列字符

.select{|char| char =~ /[aeiou]/}

只会选择'a''e''我''你'字符

.length

将计算这些字符的数量

答案 5 :(得分:0)

您的if声明无效,因为== ("a" || ...)并未告诉Ruby检查它是否与其中任何一项相同。相反,它会评估("a" || ...)并检查string[n]是否等于该值。

&#34;适当&#34;简化表达式是这样的:

string[n] =~ /aeiou/i

假设你想要不区分大小写,那就是。如果没有,请使用:

string[n] =~ /aeiou/

请注意,使用此解决方案,您必须转义任何正则表达式元字符(.[]()等。

如果您不想这样做,请改用以下内容:

['a', 'e', 'i', 'o', 'u'].include? string[n]