Workarounds for replacing self

J

Jp Hastings-spital

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
 
E

Eleanor McHugh

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

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
 
J

Jp Hastings-spital

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

Robert Klemme

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
 
J

Jp Hastings-spital

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!
 
R

Robert Klemme

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
 
J

Jp Hastings-spital

Robert said:
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?
 
R

Robert Klemme

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?

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top