Ruby_Array_26

この記事は、以下のドキュメントを改変(自分なりに整理)して利用しています。

class Array (Ruby 3.0.0 リファレンスマニュアル)

インスタンスメソッド

find_index(val) -> Integer | nil
index(val) -> Integer | nil
find_index {|item| ...} -> Integer | nil
index {|item| ...} -> Integer | nil
find_index -> Enumerator
index -> Enumerator
  • 条件に一致する最初の要素の位置を返す
    • 等しい要素がひとつもなかった場合はnilを返す
  • ブロックが与えられた場合、各要素を引数として順にブロックを実行し、ブロックが真を返した最初の要素を返す
    • 一つも真にならなかった場合はnilを返す
  • 引数、ブロックのどちらも与えられなかった場合は、Enumeratorのインスタンスを返す
irb(main):001:0> ['a', 'b', 'c'].find_index('b')
=> 1

irb(main):002:0> ['a', 'b', 'c'].find_index('z')
=> nil
irb(main):001:0> [10, 20, 30].find_index {|v| v > 15 }
=> 1

irb(main):002:0> [10, 20, 30].find_index {|v| v > 100 }
=> nil
irb(main):001:0> arr = [10, 20, 30]
=> [10, 20, 30]

irb(main):002:0> enum = arr.find_index
=> #<Enumerator: [10, 20, 30]:find_index>

irb(main):003:0> arr[1] = 100
=> 100

irb(main):004:0> enum
=> #<Enumerator: [10, 100, 30]:find_index>

irb(main):005:0> enum.each {|v| v > 50 }
=> 1

irb(main):006:0> enum
=> #<Enumerator: [10, 100, 30]:find_index>

irb(main):007:0> enum.each {|v| v > 500 }
=> nil

irb(main):008:0> enum
=> #<Enumerator: [10, 100, 30]:find_index>
# find_indexとindexの内部実装は同じようだ。

[1] pry(main)> require 'pry-doc'
=> true
[2] pry(main)> show-source Array#find_index

From: array.c (C Method):
Owner: Array
Visibility: public
Signature: find_index(*arg1)
Number of lines: 27

static VALUE
rb_ary_index(int argc, VALUE *argv, VALUE ary)
{
    VALUE val;
    long i;

    if (argc == 0) {
        RETURN_ENUMERATOR(ary, 0, 0);
        for (i=0; i<RARRAY_LEN(ary); i++) {
            if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) {
                return LONG2NUM(i);
            }
        }
        return Qnil;
    }
    rb_check_arity(argc, 0, 1);
    val = argv[0];
    if (rb_block_given_p())
        rb_warn("given block not used");
    for (i=0; i<RARRAY_LEN(ary); i++) {
        VALUE e = RARRAY_AREF(ary, i);
        if (rb_equal(e, val)) {
            return LONG2NUM(i);
        }
    }
    return Qnil;
}
[3] pry(main)> show-source Array#index

From: array.c (C Method):
Owner: Array
Visibility: public
Signature: index(*arg1)
Number of lines: 27

static VALUE
rb_ary_index(int argc, VALUE *argv, VALUE ary)
{
    VALUE val;
    long i;

    if (argc == 0) {
        RETURN_ENUMERATOR(ary, 0, 0);
        for (i=0; i<RARRAY_LEN(ary); i++) {
            if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) {
                return LONG2NUM(i);
            }
        }
        return Qnil;
    }
    rb_check_arity(argc, 0, 1);
    val = argv[0];
    if (rb_block_given_p())
        rb_warn("given block not used");
    for (i=0; i<RARRAY_LEN(ary); i++) {
        VALUE e = RARRAY_AREF(ary, i);
        if (rb_equal(e, val)) {
            return LONG2NUM(i);
        }
    }
    return Qnil;
}