Is there anything like Array#Index that takes a block?

I would like to avoid doing :
Array.index(Enumerable.find { |blarg| blarg =~ /blah/ })

as that traverses the array twice. Is there any built in method that
does this for me? That is, it's a method that takes a block and returns
the index of the first element for which this block returns true?

Thanks

···

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

Lee Griffiths schrieb:

I would like to avoid doing :
Array.index(Enumerable.find { |blarg| blarg =~ /blah/ })

as that traverses the array twice. Is there any built in method that
does this for me? That is, it's a method that takes a block and returns
the index of the first element for which this block returns true?

Thanks

yes... it's called Array#index *scnr*
ri says:
     array.index(obj) -> int or nil
     array.index {|item| block} -> int or nil
  ...
  If a block is given instead of an argument, returns first
     object for which _block_ is true.

so...just use #index with a blocck

For followers, I believe the acceptable backport for 1.8.6 is:

if RUBY_VERSION < '1.8.7'
class Array
   alias original_index index
   def index *args

     if args.length > 0
       return original_index(*args)
     else
        pos = nil
        each_with_index do |element, i|
          if yield(element)
            return i
          end
        end
       return nil
     end
    end
  end
end

···

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

badboy wrote:

Lee Griffiths schrieb:

I would like to avoid doing :
Array.index(Enumerable.find { |blarg| blarg =~ /blah/ })

as that traverses the array twice. Is there any built in method that
does this for me? That is, it's a method that takes a block and returns
the index of the first element for which this block returns true?

Thanks

yes... it's called Array#index *scnr*
ri says:
     array.index(obj) -> int or nil
     array.index {|item| block} -> int or nil
  ...
  If a block is given instead of an argument, returns first
     object for which _block_ is true.

so...just use #index with a blocck

Which version of Ruby is that for? My ri, irb and ruby don't confirm
this. I'm using Ruby 1.8.6. Additionally RDoc Documentation
claims that Array#index only has a single implementation.

···

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

If a block is given instead of an argument, returns first
object for which _block_ is true.

I could not believe it says that, probably should provide a patch.

OP do not worry, of course it returns the index and not the object.
HTH
R.

Lee Griffiths schrieb:

badboy wrote:

Lee Griffiths schrieb:

I would like to avoid doing :
Array.index(Enumerable.find { |blarg| blarg =~ /blah/ })

as that traverses the array twice. Is there any built in method that
does this for me? That is, it's a method that takes a block and returns
the index of the first element for which this block returns true?

Thanks

yes... it's called Array#index *scnr*
ri says:
     array.index(obj) -> int or nil
     array.index {|item| block} -> int or nil
  ...
  If a block is given instead of an argument, returns first
     object for which _block_ is true.

so...just use #index with a blocck

Which version of Ruby is that for? My ri, irb and ruby don't confirm
this. I'm using Ruby 1.8.6. Additionally RDoc Documentation
claims that Array#index only has a single implementation.

hm...oh =/
ruby 1.8.7 (and 1.9.1, too)

Robert Dober schrieb:

If a block is given instead of an argument, returns first
    object for which _block_ is true.

I could not believe it says that, probably should provide a patch.

OP do not worry, of course it returns the index and not the object.
HTH
R.

ah! yeah, I saw that, too but missed to mention it. It's just a
documentation mistake

arr = %w{apple banana blarg blueberry}

pos = nil
arr.each_with_index do |str, i|
  if str =~ /bl/
    pos = i
    break
  end

end

puts pos

--output:--
2

···

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

yes indeed, but do you not think this is bad? I had to fire up irb to
check so have done billions of billions of Ruby users in the
universe...
Think big!
R.

···

On Tue, Apr 28, 2009 at 4:19 PM, badboy <badboy@heartofgold.co.cc> wrote:

Robert Dober schrieb:

If a block is given instead of an argument, returns first
object for which _block_ is true.

I could not believe it says that, probably should provide a patch.

OP do not worry, of course it returns the index and not the object.
HTH
R.

ah! yeah, I saw that, too but missed to mention it. It's just a
documentation mistake