EDIT: einen Blick auf this question nehmen, bevor Sie sich entscheiden, den Ansatz zu verwenden, die ich hier skizziert habe. Es scheint, dass es nicht die beste Vorgehensweise ist, das Verhalten einer Basisklasse in Ruby zu ändern (was ich verstehen kann). Also, nehmen Sie diese Antwort mit einem Körnchen Salz ...
MattW's answer das erste, was war ich dachte, aber ich habe auch mag es nicht sehr viel.
Ich nehme an, Sie es weniger hässlich machen könnte durch DateTime
und Fixnum
Patchen zu tun, was Sie wollen:
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
Dann können Sie Ihren Code wie folgt schreiben:
some_date = some_date - n.hours
wo n
das ist Anzahl der Stunden, die Sie abziehen möchten some_date
Beachten Sie, dass dies nur in einem Rails-Kontext funktioniert. Die hours() -Methode kommt von einem der date-Helfer in Rails, nicht von der Ruby-Standard-lib. –
Es ist frustrierend, wie so viele Leute denken, Ruby = Rails –