Ruby_Array_46

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

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

インスタンスメソッド

reject -> Enumerator
reject {|item| ... } -> [object]
  • 各要素に対してブロックを評価し、その要素が偽であった要素を集めた新しい配列を返す
  • ブロックを省略した場合はEnumeratorを返す
irb(main):001:0> [1, 2, 3, 4, 5, 6].reject { |i| i % 2 == 0 }
=> [1, 3, 5]
irb(main):001:1> enum = [1, 2, 3, 4, 5, 6].reject
=> #<Enumerator: [1, 2, 3, 4, 5, 6]:reject>

irb(main):002:0> enum.each { |v| v % 2 != 0 }
=> [2, 4, 6]
irb(main):001:0> arr = %w[a b c]
=> ["a", "b", "c"]

irb(main):002:0> enum = arr.reject
=> #<Enumerator: ["a", "b", "c"]:reject>

irb(main):003:0> arr[1].upcase!
=> "B"

irb(main):004:0> enum
=> #<Enumerator: ["a", "B", "c"]:reject>

irb(main):005:0> enum.each { |v| v == 'B' }
=> ["a", "c"]
[2] pry(main)> show-source Array#select

From: array.c (C Method):
Owner: Array
Visibility: public
Signature: select()
Number of lines: 15

static VALUE
rb_ary_select(VALUE ary)
{
    VALUE result;
    long i;

    RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
    result = rb_ary_new2(RARRAY_LEN(ary));
    for (i = 0; i < RARRAY_LEN(ary); i++) {
        if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) {
            rb_ary_push(result, rb_ary_elt(ary, i));
        }
    }
    return result;
}
[3] pry(main)> show-source Array#reject

From: array.c (C Method):
Owner: Array
Visibility: public
Signature: reject()
Number of lines: 10

static VALUE
rb_ary_reject(VALUE ary)
{
    VALUE rejected_ary;

    RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
    rejected_ary = rb_ary_new();
    ary_reject(ary, rejected_ary);
    return rejected_ary;
}

# memo
# 条件を反転させたselectと書かれていたが、内部コードはだいぶ違う

メモ