Удобные методы для класса Ruby's Number и 0 - PullRequest
4 голосов
/ 14 сентября 2010

Я пишу удобные методы, чтобы проверить, является ли число положительным или отрицательным, например:

class Numeric
  def positive?
    self > 0
  end

  def negative?
    self < 0
  end
end

но в этом случае я не знаю, как обращаться с такими случаями:

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

Обновление : Я обновил опечатку в имени класса. Я использовал числовое значение, потому что мне нужно было также проверять числа с плавающей точкой.

Ответы [ 3 ]

9 голосов
/ 08 декабря 2015

Ruby 2.3 введены Numeric#positive? и Numeric#negative?, если вы используете Ruby 2.3+, следует использовать эти два вместо.

7 голосов
/ 14 сентября 2010

Если проблема в том, что вы получаете false для обоих, либо вы считаете 0 положительным, либо нет. Если это так, у вас должно быть что-то вроде:

def positive?
    self >= 0
end

Если нет, оставьте все как есть, поскольку 0 не является ни положительным, ни отрицательным, и вы должны вернуть false для обоих.

Однако, если проблема в том, что вы получаете ошибки с 0.positive? (гораздо более вероятно), причина, по которой вы получаете проблему, заключается в том, что 0 это FixNum, а не Number. Вы можете увидеть это с помощью следующего сообщения:

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

Возможно, вам следует добавить его в Fixnum, или Integer, или Numeric, базовый класс для различных числовых типов, таких как FixNum и BigNum. Способ введения удобных методов зависит от того, насколько широко вы хотите их использовать.

Например, если вы измените свой код на следующий (я включаю тестовый код здесь):

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

как и ожидалось.

0 голосов
/ 14 сентября 2010

0 - это Fixnum, попробуйте:

p 0.class

>> Fixnum

так, измените класс Number на класс Fixnum

Я не знаю, хотите ли вы добавить этот метод в число с плавающей запятой / целые числа, но вы можете сделать что-то вроде этого:

class Float
...your methods...
end

0.to_f.positive?

есть больше возможностей для выполнения этой задачи, все зависит от того, какой тип/ класс вы хотите добавить эти методы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...