РЕДАКТИРОВАТЬ : взгляните на этот вопрос , прежде чем вы решите использовать подход, который я изложил здесь. Похоже, что не рекомендуется изменять поведение базового класса в Ruby (что я могу понять). Итак, примите этот ответ с крошкой соли ...
Ответ MattW был первым, о чем я подумал, но мне он тоже не очень понравился.
Полагаю, вы могли бы сделать это менее уродливо, добавив DateTime
и Fixnum
, чтобы сделать то, что вы хотите:
require 'date'
# A placeholder class for holding a set number of hours.
# Used so we can know when to change the behavior
# of DateTime#-() by recognizing when hours are explicitly passed in.
class Hours
attr_reader :value
def initialize(value)
@value = value
end
end
# Patch the #-() method to handle subtracting hours
# in addition to what it normally does
class DateTime
alias old_subtract -
def -(x)
case x
when Hours; return DateTime.new(year, month, day, hour-x.value, min, sec)
else; return self.old_subtract(x)
end
end
end
# Add an #hours attribute to Fixnum that returns an Hours object.
# This is for syntactic sugar, allowing you to write "someDate - 4.hours" for example
class Fixnum
def hours
Hours.new(self)
end
end
Тогда вы можете написать свой код так:
some_date = some_date - n.hours
где n
- количество часов, которое вы хотите вычесть из some_date