Workarounds for replacing self


#1

I’m attempting to build an ETA class, essentially identical to Time, but
where new accepts a number of seconds from now and generates the
underlying Time object accordingly. Obviously I can’t re-assign self, so
how should I do this?

What I’d like to do:

class ETA < Time
def initialize(seconds)
self = Time.new + seconds
end
end

Any help would be much appreciated!


#2

On 22 May 2009, at 18:19, Jp Hastings-spital wrote:

def initialize(seconds)
self = Time.new + seconds
end
end

Any help would be much appreciated!

How about something as simple as:

class ETA < Time
def self.new
ETA.at Time.now + seconds
end
end

Ellie

Eleanor McHugh
Games With Brains
http://slides.games-with-brains.net

raise ArgumentError unless @reality.responds_to? :reason


#3

Excellent! I had difficulty getting that to work with initialize because
its an instance method - thanks very much!


#4

On 22.05.2009 19:29, Eleanor McHugh wrote:

class ETA < Time
def initialize(seconds)
self = Time.new + seconds
end
end

How about something as simple as:

class ETA < Time
def self.new
ETA.at Time.now + seconds
end
end

Actually, what do we need a new class for? Basically this will do as
well, unless there are more methods added to ETA that we do not yet
know:

def Time.future(seconds)
now + seconds
end

Kind regards

robert


#5

There were a few other methods I needed - have a look:
http://gist.github.com/116293

I realise its potentially overkill making a whole new class for this,
but some of the scripts I’m now using this in have boths times and ETAs,
and a quick ‘is_a?’ allows me to distinguish them easily.
Let me know if you think you can improve it!


#6

On 24.05.2009 18:07, Jp Hastings-spital wrote:

There were a few other methods I needed - have a look:
http://gist.github.com/116293

I realise its potentially overkill making a whole new class for this,
but some of the scripts I’m now using this in have boths times and ETAs,
and a quick ‘is_a?’ allows me to distinguish them easily.
Let me know if you think you can improve it!

Not much change - you don’t need all the “selfs”:

class ETA < Time

Takes a number of seconds until the event

def self.relative(seconds)
at Time.now.to_i + seconds
end

Requires http://gist.github.com/116290

def to_s
roughly
end

Gives a full textual representation of the time expected time of

arrival (Time.rfc2822)
def eta
rfc2822
end

Has the eta passed?

def arrived?
self < Time.now
end
end

And you can directly compare Time and ETA objects.

Kind regards

robert


#7

On 24.05.2009 19:39, Jp Hastings-spital wrote:

method to self.relative? Is that personal preference, or is there a
reason you’ve kept Time’s original .new and .now?

Your ETA.new does something different than Time.new and because of that
a new name would help avoid confusion. Also, by that means you can
still use the “old” new with the old semantics, i.e. you can do ETA.new
and get an instance with the current timestamp.

You could even put relative in class Time and use it both ways:

def Time.relative(sec)
at now + sec
end

class ETA < Time

other instance methods

end

t = Time.relative 123
e = ETA.relative 123

p t, t.class, e, e.class

Kind regards

robert


#8

Robert K. wrote:

class ETA < Time

Takes a number of seconds until the event

def self.relative(seconds)
at Time.now.to_i + seconds
end

end

Thanks for the tips! Out of interest, why did you change my self.new
method to self.relative? Is that personal preference, or is there a
reason you’ve kept Time’s original .new and .now?