method

find_index

v1_8_7_72 - Show latest stable - Class: Array
find_index(...)
public

Returns the index of the first object in self such that is == to obj. If a block is given instead of an argument, returns first object for which block is true. Returns nil if no match is found.

   a = [ "a", "b", "c" ]
   a.index("b")        #=> 1
   a.index("z")        #=> nil
   a.index{|x|x=="b"}  #=> 1

This is an alias of #find_index.

2Notes

Using block version in Ruby < 1.8.7

Mange · Jul 8, 20095 thanks

The block usage was added in 1.8.7, so to get the same functionality in an earlier version of Ruby, you need to utilize the find method.

Here is a quick example:

match = list.find { |l| l.owner == myself }
match_index = list.index(match)

If you do some gymnastics, you can have it on one line without extra variables:

match_index = list.index(list.find { |l| l.owner == myself })

Using find_index to return first match. Profit!

l3x · Sep 27, 20131 thank

This example shows how to use find_index to return a result as soon as the first occurrence of what you are looking for is found.

==== Code example
class Widget < Struct.new(:name, :profit); end

class WidgetManager
def initialize(*widgets)
  @widgets = widgets
end
def is_any_widget_profitable?
  @widgets.find_index { |w| w.profit > 0 }  # <== usage!
end
end

wm = WidgetManager.new(Widget.new('a', -100), Widget.new('b', 200), Widget.new('c', 300))
wm.is_any_widget_profitable?  # => 1
(wm.is_any_widget_profitable?) ? 'some profit' : 'all loss'  # => "some profit"

wm = WidgetManager.new(Widget.new('a', -100), Widget.new('b', -200), Widget.new('c', -300))
wm.is_any_widget_profitable?  # => nil
(wm.is_any_widget_profitable?) ? 'some profit' : 'all loss'  # => "all loss"