这是一个用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
语句在这里不起作用?
答案 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"
(它不是nil
或false
),所以基本上与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]