Ruby的Number类和0的便捷方法

时间:2010-09-14 07:09:08

标签: ruby numbers

我正在编写便利方法,以检查数字是正数还是负数,如下所示:

class Numeric
  def positive?
    self > 0
  end

  def negative?
    self < 0
  end
end

但在这种情况下,我不知道如何处理这样的案件:

>> 0.positive?
>> 0.negative?

更新:我更新了班级名称中的拼写错误。我使用数字,因为我也需要检查浮点数。

3 个答案:

答案 0 :(得分:9)

Ruby 2.3 introduced Numeric#positive? and Numeric#negative?,如果您使用的是Ruby 2.3+,则应使用这两个。

答案 1 :(得分:7)

如果问题是你两者都得到false,你要么认为0是正面的。如果是这样,你应该有:

def positive?
    self >= 0
end

如果没有,请保持原样,因为0既不是肯定的也不是否定的,而应该为两者返回false。

但是,如果问题是您遇到0.positive?错误(更有可能),那么您遇到问题的原因是因为0FixNum,而不是一个Number。您可以通过以下消息看到:

testprog.rb:12: undefined method `positive?' for 0:Fixnum (NoMethodError)

您应该将其添加到Fixnum本身,或IntegerNumeric,这是FixNumBigNum等各种数字类型的基类。注入便利方法的地方取决于您希望它们的可用范围。

例如,如果您将代码更改为以下内容(我在此处包含测试代码):

class Numeric
    def positive?
        self > 0
    end

    def negative?
        self < 0
    end
end

print " 0 positive?: ",  0.positive?,"\n"
print " 0 negative?: ",  0.negative?,"\n"
print " 0 zero?    : ",  0.zero?,"\n\n"

print "99 positive?: ", 99.positive?,"\n"
print "99 negative?: ", 99.negative?,"\n"
print "99 zero?    : ", 99.zero?,"\n\n"

print "-2 positive?: ", -2.positive?,"\n"
print "-2 negative?: ", -2.negative?,"\n"
print "-2 zero?    : ", -2.zero?,"\n\n"

然后它正常工作,输出:

 0 positive?: false
 0 negative?: false
 0 zero?    : true

99 positive?: true
99 negative?: false
99 zero?    : false

-2 positive?: false
-2 negative?: true
-2 zero?    : false

正如所料。

答案 2 :(得分:0)

0是Fixnum,请尝试:

p 0.class
  

&GT;&GT; Fixnum对象

所以,将班级编号更改为班级 Fixnum

我不知道你是否想要将这些方法添加到浮点数/整数中,但你可以这样做:

class Float
...your methods...
end

0.to_f.positive?

有更多的可能性来完成这项任务,所有这些都取决于你想要添加这个方法的类型/类