Howdy,
I’m writing my first Ruby application and have a few super-newbie
questions, so bear with me…I’m trying to add date precision to the
existing Date and DateTime classes.
My first attempt involves a module with a simple nested value class and
a standalone subclass of DateTime:
require ‘date’
module Runt
module DatePrecision
YEAR=0
…
HOUR_OF_DAY=3
…etc.
HOUR_OF_DAY_PREC = Precision.new(HOUR_OF_DAY)
def to_hour_of_day(arg)
#DateTimes are immutable
HOUR_OF_DAY_PREC.to_p(
DateTime,
*[arg.year,arg.mon,arg.day,arg.hour,0,0])
end
class Precision
include Comparable
attr :precision
def initialize(prec)
@precision = prec
end
def <=>(other)
self.precision <=> other.precision
end
def to_p(klass, *args)
klass.new(*args)
end
end
end
end
···
–
require ‘date’
class DateWithPrecision < DateTime
include Runt::DatePrecision
attr :precision
def initialize(*args)
@precision = args.pop
super(*args)
end
#This doesn’t work either?!
def initialize(yr=1,mon=1,day=1,hr=0,min=0,sec=0)
super(yr,mon,day,hr,min,sec)
end
end
However when I do something like this:
day_precise
= DateWithPrecision.new(1998,12,12,14,58,32,HOUR_OF_DAY_PREC)
or even this
day_precise = DateWithPrecision.new(1998,12,12,14,58,32)
I get errors like the following:
ArgumentError: wrong number of arguments(6 for 3)
dateprecisiontest.rb:116:in initialize' dateprecisiontest.rb:116:in
initialize’
/usr/lib/ruby/1.8/date.rb:1175:in new0' /usr/lib/ruby/1.8/date.rb:1175:in
new’
dateprecisiontest.rb:56:in `test_to_precision’
4 tests, 16 assertions, 0 failures, 1 errors
I can’t seem to call Date/DateTime’s constructor from my subclass; even
when I don’t add or change arguments.
Is it, in fact, a bad idea to have a module create instance variables?
Is there another, simpler/better way of doing this?
I’m running Ruby 1.8.1 on RedHat 9.
Any feedback is greatly appreciated.
Thanks!
Matt