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と書かれていたが、内部コードはだいぶ違う
メモ
- 関数一覧のドキュメントがあるのを今知った。
- 関数一覧 (Ruby 3.1 リファレンスマニュアル)
- Array#select, Array#rejectで使われているrb_ary_new2, rb_ary_newの違いもパッとわかる