def starts_with_consonant?(str)
str.empty? || str.class != String || /\A[^aeiou]/i=~str
end
p starts_with_consonant? "Apple" #=>nil
p starts_with_consonant? "microsoft"#=> 0
我希望它返回true或false,但它返回nil和0.
答案 0 :(得分:1)
这是因为在匹配的情况下,最后一个表达式中的正则表达式测试返回nil或0。你需要将匹配强制转换为布尔值
def starts_with_consonant?(str)
str.empty? || str.class != String || (/\A[^aeiou]/i=~str != nil)
end
答案 1 :(得分:0)
在Ruby中,除了nil
和false
之外,每个对象都被认为是真实的(真实的)。这包括0:
puts '0 is true' if 0
0 is true
出于所有意图和目的,您的代码已经返回false和true,它将与if
或布局运算符(如&&
和||
)一起正常运行。
只有直接比较才能显示出差异:
starts_with_consonant? "Apple" == false
=> false
但Ruby中的任何内容都不需要这样的比较,并且通常被认为是糟糕的风格。只需使用if
或unless
if starts_with_consonant? "Apple"
#...
end
unless starts_with_consonant? "Apple"
#...
end