Workarounds for replacing self

Discussion in 'Ruby' started by Jp Hastings-spital, May 22, 2009.

  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!
    --
    Posted via http://www.ruby-forum.com/.
    Jp Hastings-spital, May 22, 2009
    #1
    1. Advertising

  2. 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-brains.net
    ----
    raise ArgumentError unless @reality.responds_to? :reason
    Eleanor McHugh, May 22, 2009
    #2
    1. Advertising

  3. 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/.
    Jp Hastings-spital, May 22, 2009
    #3
  4. 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.rubybestpractices.com/
    Robert Klemme, May 24, 2009
    #4
  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!
    --
    Posted via http://www.ruby-forum.com/.
    Jp Hastings-spital, May 24, 2009
    #5
  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


    --
    remember.guy do |as, often| as.you_can - without end
    http://blog.rubybestpractices.com/
    Robert Klemme, May 24, 2009
    #6
  7. 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/.
    Jp Hastings-spital, May 24, 2009
    #7
  8. 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.rubybestpractices.com/
    Robert Klemme, May 24, 2009
    #8
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Ralf W. Grosse-Kunstleve
    Replies:
    16
    Views:
    578
    Lonnie Princehouse
    Jul 11, 2005
  2. Ralf W. Grosse-Kunstleve
    Replies:
    18
    Views:
    592
    Bengt Richter
    Jul 11, 2005
  3. Ralf W. Grosse-Kunstleve
    Replies:
    2
    Views:
    399
    Dan Sommers
    Jul 12, 2005
  4. falcon
    Replies:
    0
    Views:
    372
    falcon
    Jul 31, 2005
  5. Bart Kastermans
    Replies:
    6
    Views:
    401
    Bart Kastermans
    Jul 13, 2008
Loading...

Share This Page