Ruby 无法简化'if'语句条件

Ruby 无法简化'if'语句条件,ruby,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 但是,在此

下面是一个函数,用于在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

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

它不会返回正确的计数,因为| | in if string[n]==a | | i | | u | | e | | | o计算为第一个非false条件,在本例中,a不是nil或false,因此基本上与字符串[n]==a相同。您可以尝试使用include?:

还是进来


它不会返回正确的计数,因为| | in if string[n]==a | | i | | | u | | e | | | o计算为第一个非false条件,在本例中,a不是nil或false,因此基本上与字符串[n]==a相同。您可以尝试使用include?:

还是进来

增加定期支出

 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
将执行相同的功能

  string.split('')
将为您提供字符数组

.select{|char| char =~ /[aeiou]/}
.length
将仅选择“a”“e”“i”“o”“u”个字符

.select{|char| char =~ /[aeiou]/}
.length
将计算这些字符的数量

添加常规经验

 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
.select{|char| char =~ /[aeiou]/}
.length
将执行相同的功能

  string.split('')
将为您提供字符数组

.select{|char| char =~ /[aeiou]/}
.length
将仅选择“a”“e”“i”“o”“u”个字符

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

将计算这些字符的数量

有多种方法可以实现您想要的功能,但它不起作用的原因是,ruby对a | e | | | i | | | o | | u进行求值,以返回这些字符中不为假或为零的第一个。本质上,该子句始终返回一个:

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

这意味着您总是在测试字符串[n]==a,这显然不是您的目标。

有多种方法可以实现您想要的,但它不起作用的原因是,ruby对a | e | i | o | u进行求值,以返回这些字符中不为假或为零的第一个。本质上,该子句始终返回一个:

这意味着您总是在测试字符串[n]==a,这显然不是您的目标。

它不起作用,因为a==x | | y没有扩展为a==x | | a==y

相反,将a与x | | y的结果进行比较

相当于:

if string[n] == "a"
因为:

("a"||"i"||"u"||"e"||"o") #=> "a"
如果要简化代码,请使用:

它不起作用,因为a==x | | y没有扩展为a==x | | a==y

相反,将a与x | | y的结果进行比较

相当于:

if string[n] == "a"
因为:

("a"||"i"||"u"||"e"||"o") #=> "a"
如果要简化代码,请使用:


回答你的问题

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
您还可以扩展string类以获得乐趣

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

回答你的问题

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
您还可以扩展string类以获得乐趣

class String
  def vowels_count
    chars.count{ |c| c  =~ /[aeiou]+/i }
  end
end
if语句不起作用,因为==a | |。。。不会让Ruby检查它是否等于这些。相反,它会计算一个| |。。。并检查字符串[n]是否等于该值

适当的简化表达式如下:

string[n] =~ /aeiou/i
假设你想要不区分大小写,也就是说。如果没有,请使用以下选项:

string[n] =~ /aeiou/
请注意,使用此解决方案,您必须转义任何regex元字符、[]等

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

['a', 'e', 'i', 'o', 'u'].include? string[n]
if语句不起作用,因为==a | |。。。不会让Ruby检查它是否等于这些。相反,它会计算一个| |。。。并检查字符串[n]是否等于该值

适当的简化表达式如下:

string[n] =~ /aeiou/i
假设你想要不区分大小写,也就是说。如果没有,请使用以下选项:

string[n] =~ /aeiou/
请注意,使用此解决方案,您必须转义任何regex元字符、[]等

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

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

在@Stefan的文本AEIOUPOPOSABLE副本中进行搜索,将向您展示如何用一行21个字符替换方法中的所有代码。Ruby不是很棒吗?在@Stefan的文本aeioupossible副本中进行搜索,将向您展示如何用一行21个字符替换方法中的所有代码。Ruby不是很棒吗?或者更好:“foobar”。count'aeiou'=>3.OP=原创海报,就是写问题的人。或者更好的是:“foobar”。count'aeiou'=>3.OP=原创海报,写问题的人。这不是在回答实际问题。这不是在回答实际问题。你可能应该在回答中提到,它不适合大写字母。这也许可以回答这个问题,但OP可能想计算出字母的大小写。你可能应该在回答中提到,它不适合大写字母。这也许可以回答这个问题,但OP可能想要计算出字母的元音,这些元音应该是小写和大写元音。