Time#succ ?

Discussion in 'Ruby' started by Hal Fulton, Nov 23, 2003.

  1. Hal Fulton

    Hal Fulton Guest

    Should this be added? It would enable the creation
    of Time ranges like t1..t2 and so on.

    I'd assume that seconds would be the default resolution
    (although the actual resolution is platform-dependent).

    Hal
    Hal Fulton, Nov 23, 2003
    #1
    1. Advertising

  2. Hi,

    In message "Time#succ ?"
    on 03/11/24, Hal Fulton <> writes:

    |Should this be added? It would enable the creation
    |of Time ranges like t1..t2 and so on.
    |
    |I'd assume that seconds would be the default resolution
    |(although the actual resolution is platform-dependent).

    I like the idea. How should I treat sub-second value?

    n = Time.now
    p n.to_f # 1069633904.88943
    p n.succ.to_f # 1069633905.88943 or 1069633905.0 or 1069633906.0?

    matz.
    Yukihiro Matsumoto, Nov 24, 2003
    #2
    1. Advertising

  3. Hal Fulton

    Hal Fulton Guest

    Yukihiro Matsumoto wrote:
    > Hi,
    >
    > In message "Time#succ ?"
    > on 03/11/24, Hal Fulton <> writes:
    >
    > |Should this be added? It would enable the creation
    > |of Time ranges like t1..t2 and so on.
    > |
    > |I'd assume that seconds would be the default resolution
    > |(although the actual resolution is platform-dependent).
    >
    > I like the idea. How should I treat sub-second value?
    >
    > n = Time.now
    > p n.to_f # 1069633904.88943
    > p n.succ.to_f # 1069633905.88943 or 1069633905.0 or 1069633906.0?


    I would expect the first case.

    Then n.succ.to_f would behave the same as (n+1).to_f,
    isn't that correct?

    Hal
    Hal Fulton, Nov 24, 2003
    #3
  4. Hal Fulton

    Paul Brannan Guest

    On Mon, Nov 24, 2003 at 05:36:49AM +0900, Hal Fulton wrote:
    > Should this be added? It would enable the creation
    > of Time ranges like t1..t2 and so on.


    Does this not already work?

    [pbrannan@zaphod ruby]$ irb
    irb(main):001:0> t = Time.now
    => Wed Nov 26 16:27:46 EST 2003
    irb(main):002:0> (t .. t+1)
    => Wed Nov 26 16:27:46 EST 2003..Wed Nov 26 16:27:47 EST 2003

    (the problem only comes if you want to iterate over the range, which
    seems to me to be an ill-defined operation).

    Paul
    Paul Brannan, Nov 26, 2003
    #4
  5. Hal Fulton

    Hal Fulton Guest

    Paul Brannan wrote:
    > On Mon, Nov 24, 2003 at 05:36:49AM +0900, Hal Fulton wrote:
    >
    >>Should this be added? It would enable the creation
    >>of Time ranges like t1..t2 and so on.

    >
    >
    > Does this not already work?
    >
    > [pbrannan@zaphod ruby]$ irb
    > irb(main):001:0> t = Time.now
    > => Wed Nov 26 16:27:46 EST 2003
    > irb(main):002:0> (t .. t+1)
    > => Wed Nov 26 16:27:46 EST 2003..Wed Nov 26 16:27:47 EST 2003
    >
    > (the problem only comes if you want to iterate over the range, which
    > seems to me to be an ill-defined operation).


    Hmmm. For some reason I thought that to have a Range, the
    endpoint objects had to know #succ.

    Apparently Time ranges do work fine. I don't know why I
    never thought of them before.

    As for iterating: I agree it's ill-defined, but I think it's
    reasonable to let t.succ be the same as t+1 (since the latter
    is already meaningful).

    But since I can construct a Time range and call include? on it,
    I suppose that's all we really need.

    Hal
    Hal Fulton, Nov 26, 2003
    #5
  6. Hal Fulton

    Ara.T.Howard Guest

    On Thu, 27 Nov 2003, Paul Brannan wrote:

    > Date: Thu, 27 Nov 2003 06:29:10 +0900
    > From: Paul Brannan <>
    > Newsgroups: comp.lang.ruby
    > Subject: Re: Time#succ ?
    >
    > On Mon, Nov 24, 2003 at 05:36:49AM +0900, Hal Fulton wrote:
    > > Should this be added? It would enable the creation
    > > of Time ranges like t1..t2 and so on.

    >
    > Does this not already work?
    >
    > [pbrannan@zaphod ruby]$ irb
    > irb(main):001:0> t = Time.now
    > => Wed Nov 26 16:27:46 EST 2003
    > irb(main):002:0> (t .. t+1)
    > => Wed Nov 26 16:27:46 EST 2003..Wed Nov 26 16:27:47 EST 2003
    >
    > (the problem only comes if you want to iterate over the range, which
    > seems to me to be an ill-defined operation).



    anyone familiar with the 'jot' unix program? i think ranges should work like
    that - eg. one should be able to define the increment

    day = 60 * 60 * 24

    a = Time.now
    b = Time.now + (7 * day)

    week = (a...b)

    week.each(step = day) do |weekday|
    ...
    end

    as it is needs to overide the #succ method of an object for that to occur.


    i realize this is problematic since currently ranges only rely on having a
    #succ method, but perhaps this could be extend such that Range#each takes an
    optional argument, step. if this is given it will be passed to the objects
    #step method, something similar to:


    ~ > cat timestep.rb

    class Range
    alias __each each
    def each step = nil, &block
    nxt, e = self.begin, self.end

    if nxt.respond_to? :step
    loop do
    yield nxt
    nxt = nxt.step step
    break if (exclude_end? ? nxt >= e : nxt > e)
    end
    else
    __each &block
    end
    end
    end

    class Time;
    def step n; self + n; end
    end

    a = Time.now
    b = Time.now + (7 * 24 * 60 * 60)

    week = (a...b)

    week.each(24 * 60 * 60) do |day|
    p day
    end

    ~ > ruby timestep.rb

    Wed Nov 26 15:29:18 MST 2003
    Thu Nov 27 15:29:18 MST 2003
    Fri Nov 28 15:29:18 MST 2003
    Sat Nov 29 15:29:18 MST 2003
    Sun Nov 30 15:29:18 MST 2003
    Mon Dec 01 15:29:18 MST 2003
    Tue Dec 02 15:29:18 MST 2003
    Wed Dec 03 15:29:18 MST 2003


    -a
    --

    ATTN: please update your address books with address below!

    ===============================================================================
    | EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
    | PHONE :: 303.497.6469
    | ADDRESS :: E/GC2 325 Broadway, Boulder, CO 80305-3328
    | STP :: http://www.ngdc.noaa.gov/stp/
    | NGDC :: http://www.ngdc.noaa.gov/
    | NESDIS :: http://www.nesdis.noaa.gov/
    | NOAA :: http://www.noaa.gov/
    | US DOC :: http://www.commerce.gov/
    |
    | The difference between art and science is that science is what we
    | understand well enough to explain to a computer.
    | Art is everything else.
    | -- Donald Knuth, "Discover"
    |
    | /bin/sh -c 'for l in ruby perl;do $l -e "print \"\x3a\x2d\x29\x0a\"";done'
    ===============================================================================
    Ara.T.Howard, Nov 26, 2003
    #6
  7. "Ara.T.Howard" <> wrote:

    > anyone familiar with the 'jot' unix program? i think ranges should work like
    > that - eg. one should be able to define the increment
    >
    > day = 60 * 60 * 24
    >
    > a = Time.now
    > b = Time.now + (7 * day)
    >
    > week = (a...b)
    >
    > week.each(step = day) do |weekday|
    > ...
    > end


    Maybe Range#step:

    day = 60*60*24
    a = Time.now
    b = a + 7 * day

    (a..b).step(day) {|t| puts t}

    Unfortunately:

    ./gem:20:in `step': cannot iterate from Time (TypeError)

    A work-around:

    a = Time.now.to_i
    b = a + 7 * day

    (a..b).step(day) {|t| puts Time.at(t)}
    Sabby and Tabby, Nov 27, 2003
    #7
  8. >>anyone familiar with the 'jot' unix program? i think ranges should work like
    >>that - eg. one should be able to define the increment
    >>
    >>day = 60 * 60 * 24
    >>
    >>a = Time.now
    >>b = Time.now + (7 * day)
    >>
    >>week = (a...b)
    >>
    >>week.each(step = day) do |weekday|
    >> ...
    >>end


    I think a rather nice way of doing this is "by example":

    def loop_over(v1,v2,vn)
    x = v1
    step = v2 - v1
    while x <= vn
    yield x
    x += step
    end
    end

    loop_over(1,2,10) {|x| puts x} # -> 1,2,3,4,5,6,7,8,9,10

    day = 60 * 60 * 24
    t = Time.now

    loop_over(t, t + day, t + 7*day) do |weekday|

    // Niklas
    Niklas Frykholm, Nov 28, 2003
    #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. Neha
    Replies:
    37
    Views:
    1,358
  2. illocutionist
    Replies:
    3
    Views:
    126
    Mauricio Fernández
    Mar 6, 2004
  3. Jeff Mitchell

    Propose Range.new(..., &succ)

    Jeff Mitchell, Apr 24, 2004, in forum: Ruby
    Replies:
    2
    Views:
    92
    Tim Sutherland
    Apr 26, 2004
  4. trans.  (T. Onoma)

    reverse #succ ?

    trans. (T. Onoma), Oct 27, 2004, in forum: Ruby
    Replies:
    8
    Views:
    331
    illocutionist
    Nov 10, 2004
  5. paul
    Replies:
    10
    Views:
    193
    Tom Werner
    Nov 10, 2006
Loading...

Share This Page