[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Workarounds for replacing self

Jp Hastings-spital

5/22/2009 5:20:00 PM

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!
--
Posted via http://www.ruby-....

7 Answers

Eleanor McHugh

5/22/2009 5:30:00 PM

0

On 22 May 2009, at 18:19, Jp Hastings-spital wrote:
> 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!

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-...
----
raise ArgumentError unless @reality.responds_to? :reason


Jp Hastings-spital

5/22/2009 5:40:00 PM

0

Excellent! I had difficulty getting that to work with initialize because
its an instance method - thanks very much!
--
Posted via http://www.ruby-....

Robert Klemme

5/24/2009 3:42:00 PM

0

On 22.05.2009 19:29, Eleanor McHugh wrote:
> On 22 May 2009, at 18:19, Jp Hastings-spital wrote:
>> 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

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

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestprac...

Jp Hastings-spital

5/24/2009 4:07:00 PM

0

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

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!
--
Posted via http://www.ruby-....

Robert Klemme

5/24/2009 4:56:00 PM

0

On 24.05.2009 18:07, Jp Hastings-spital wrote:
> There were a few other methods I needed - have a look:
> http://gist.github....
>
> 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....
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


--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestprac...

Jp Hastings-spital

5/24/2009 5:40:00 PM

0

Robert Klemme 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?
--
Posted via http://www.ruby-....

Robert Klemme

5/24/2009 5:55:00 PM

0

On 24.05.2009 19:39, Jp Hastings-spital wrote:
> Robert Klemme 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?

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

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestprac...