Workarounds for replacing self

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-forum.com/.

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

···

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!

----
raise ArgumentError unless @reality.responds_to? :reason

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

···

--
Posted via http://www.ruby-forum.com/.

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

···

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

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

There were a few other methods I needed - have a look:

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-forum.com/.

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

···

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!

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

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-forum.com/.

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

···

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?

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