Ruby的Number类和0的便捷方法

Eim*_*tas 4 ruby numbers

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

class Numeric
  def positive?
    self > 0
  end

  def negative?
    self < 0
  end
end
Run Code Online (Sandbox Code Playgroud)

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

>> 0.positive?
>> 0.negative?
Run Code Online (Sandbox Code Playgroud)

更新:我已经更新了班级名称中的拼写错误.我使用数字因为我也需要检查花车.

Jua*_*tas 9

红宝石2.3 引入了Numeric#positive?Numeric#negative?,如果你是红宝石2.3+,应该使用这两个来代替.


pax*_*blo 7

如果问题是你要false两者兼顾,要么你认为0是积极的.如果是这样,你应该有类似的东西:

def positive?
    self >= 0
end
Run Code Online (Sandbox Code Playgroud)

如果没有,请保持原样,因为0既不是正面也不是负面,你应该为两者都返回false.

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

testprog.rb:12: undefined method `positive?' for 0:Fixnum (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

您应该将它添加到Fixnum自身,或者Integer,或者Numeric,各种数字类型的基类,如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"
Run Code Online (Sandbox Code Playgroud)

它然后工作正常,输出:

 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
Run Code Online (Sandbox Code Playgroud)

正如所料.

  • 我完全不同意.零不是一个正数,任何合理的程序员必须阅读/修改你的代码可能会假设为0.positive?和0.负?都会返回假.毕竟,计算机科学是数学的一个分支. (5认同)