Ruby返回错误的类型

时间:2014-04-20 01:36:51

标签: ruby

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.

2 个答案:

答案 0 :(得分:1)

这是因为在匹配的情况下,最后一个表达式中的正则表达式测试返回nil或0。你需要将匹配强制转换为布尔值

def starts_with_consonant?(str)
   str.empty? || str.class != String ||  (/\A[^aeiou]/i=~str != nil)
end

答案 1 :(得分:0)

在Ruby中,除了nilfalse之外,每个对象都被认为是真实的(真实的)。这包括0:

puts '0 is true' if 0
0 is true

出于所有意图和目的,您的代码已经返回false和true,它将与if或布局运算符(如&&||)一起正常运行。 只有直接比较才能显示出差异:

starts_with_consonant? "Apple" == false
=> false

但Ruby中的任何内容都不需要这样的比较,并且通常被认为是糟糕的风格。只需使用ifunless

即可
if starts_with_consonant? "Apple"
  #...
end

unless starts_with_consonant? "Apple"
  #...
end