Ruby feature request - enum.detect_index

Hi,

I'd like to propose a new addition to the enum module.

detect works great but doesn't supply the index of the match. It would
be nice to have a method detect_index that returned the index rather
than the object.

Use example:

irb(main):001:0> foo =`uptime`.strip.split(' ')
=> ["14:36:06", "up", "157", "days,", "16:59,", "35", "users,", "load",
"average:", "0.54,", "0.31,", "0.27"]
irb(main):002:0> bar=nil
=> nil
irb(main):003:0> foo.each_with_index {|o,i| if o=="users,"; bar=i;
break; end;}
=> nil
irb(main):004:0> foo[2..bar-2]
=> ["157", "days,", "16:59,"]

Lines 2 to 4 would be expressed in a much more concise manner, i.e.

irb(main):001:0> foo =`uptime`.strip.split(' ')
=> ["14:36:06", "up", "157", "days,", "16:59,", "35", "users,", "load",
"average:", "0.54,", "0.31,", "0.27"]
irb(main):002:0> foo[2..foo.detect_index {|o| o=="users,"}-2]
=> ["157", "days,", "16:59,"]

Thoughts?

Jon T

You can do it with enumerator:

  require 'enumerator'
  [1,2,3,4,5,6].to_enum(:each_with_index).detect {|elem, index| elem
== 4} #=> [4,3]

(enumerator is probably the one library in the stdlib I use most. It
is amazingly useful)

-Levin

···

On 2/5/06, jonT <j@tippell.com> wrote:

I'd like to propose a new addition to the enum module.

detect works great but doesn't supply the index of the match. It would
be nice to have a method detect_index that returned the index rather
than the object.

Hi,

···

In message "Re: Ruby feature request - enum.detect_index" on Sun, 5 Feb 2006 23:43:19 +0900, "jonT" <j@Tippell.com> writes:

detect works great but doesn't supply the index of the match. It would
be nice to have a method detect_index that returned the index rather
than the object.

Nice idea. I'd rather name it 'find_index' though.

              matz.

For this case, this might work?

  foo[2..foo.index("users,")-2]
  # => ["1", "day,", "14:18,"]

More generally, I'd personally like a block on 'index', such that:

  foo.index("users,")
  # => 6

  foo.index { |s| s == "users," }
  # => 6

Just MHO.

···

On Sun, 05 Feb 2006 14:41:21 -0000, jonT <j@Tippell.com> wrote:

I'd like to propose a new addition to the enum module.

detect works great but doesn't supply the index of the match. It would
be nice to have a method detect_index that returned the index rather
than the object.

Use example:

irb(main):001:0> foo =`uptime`.strip.split(' ')
=> ["14:36:06", "up", "157", "days,", "16:59,", "35", "users,", "load",
"average:", "0.54,", "0.31,", "0.27"]
irb(main):002:0> bar=nil
=> nil
irb(main):003:0> foo.each_with_index {|o,i| if o=="users,"; bar=i;
break; end;}
=> nil
irb(main):004:0> foo[2..bar-2]
=> ["157", "days,", "16:59,"]

Lines 2 to 4 would be expressed in a much more concise manner, i.e.

irb(main):001:0> foo =`uptime`.strip.split(' ')
=> ["14:36:06", "up", "157", "days,", "16:59,", "35", "users,", "load",
"average:", "0.54,", "0.31,", "0.27"]
irb(main):002:0> foo[2..foo.detect_index {|o| o=="users,"}-2]
=> ["157", "days,", "16:59,"]

--
Ross Bamford - rosco@roscopeco.remove.co.uk

Hi,

detect works great but doesn't supply the index of the match. It
would be nice to have a method detect_index that returned the index
rather than the object.

Nice idea. I'd rather name it 'find_index' though.

Don't we have that already?

%w{foo bar baz}.index "baz"

=> 2

Or am I missing something?

Kind regards

    robert

···

Yukihiro Matsumoto <matz@ruby-lang.org> wrote:

In message "Re: Ruby feature request - enum.detect_index" > on Sun, 5 Feb 2006 23:43:19 +0900, "jonT" <j@Tippell.com> writes:

Hi,

···

In message "Re: Ruby feature request - enum.detect_index" on Mon, 6 Feb 2006 00:43:20 +0900, "Ross Bamford" <rosco@roscopeco.remove.co.uk> writes:

More generally, I'd personally like a block on 'index', such that:

foo.index("users,")
# => 6

foo.index { |s| s == "users," }
# => 6

It does so in 1.9.

              matz.

You can not use a block of Ruby code to select the item you would like an index for, in this example.

James Edward Gray II

···

On Feb 5, 2006, at 9:48 AM, Robert Klemme wrote:

Yukihiro Matsumoto <matz@ruby-lang.org> wrote:

Hi,
In message "Re: Ruby feature request - enum.detect_index" >> on Sun, 5 Feb 2006 23:43:19 +0900, "jonT" <j@Tippell.com> writes:

detect works great but doesn't supply the index of the match. It
would be nice to have a method detect_index that returned the index
rather than the object.

Nice idea. I'd rather name it 'find_index' though.

Don't we have that already?

%w{foo bar baz}.index "baz"

=> 2

Or am I missing something?

Cool, so it does :slight_smile: I need to update my snapshot more often I guess ...

Thanks,

···

On Sun, 05 Feb 2006 15:50:22 -0000, Yukihiro Matsumoto <matz@ruby-lang.org> wrote:

Hi,

In message "Re: Ruby feature request - enum.detect_index" > on Mon, 6 Feb 2006 00:43:20 +0900, "Ross Bamford" > <rosco@roscopeco.remove.co.uk> writes:

>More generally, I'd personally like a block on 'index', such that:
>
> foo.index("users,")
> # => 6
>
> foo.index { |s| s == "users," }
> # => 6

It does so in 1.9.

--
Ross Bamford - rosco@roscopeco.remove.co.uk

>More generally, I'd personally like a block on 'index', such that:
>
> foo.index("users,")
> # => 6
>
> foo.index { |s| s == "users," }
> # => 6

It does so in 1.9.

Ah! in that case my detect_index suggestion was rather unnecessary
[apologies - I also am guilty of running an ancient version of 1.9
(ubuntu's is ruby 1.9.0 (2005-06-23) (!)]

Jon T

Good point. In that case I'd just change the implementation of #index to either accept an argument or a block. This cannot break old code because at the moment blocks are not permitted / ignored.

Kind regards

    robert

···

James Edward Gray II <james@grayproductions.net> wrote:

On Feb 5, 2006, at 9:48 AM, Robert Klemme wrote:

Yukihiro Matsumoto <matz@ruby-lang.org> wrote:

Hi,
In message "Re: Ruby feature request - enum.detect_index" >>> on Sun, 5 Feb 2006 23:43:19 +0900, "jonT" <j@Tippell.com> writes:

detect works great but doesn't supply the index of the match. It
would be nice to have a method detect_index that returned the index
rather than the object.

Nice idea. I'd rather name it 'find_index' though.

Don't we have that already?

%w{foo bar baz}.index "baz"

=> 2

Or am I missing something?

You can not use a block of Ruby code to select the item you would
like an index for, in this example.