Ruby_Array_39
この記事は、以下のドキュメントを改変(自分なりに整理)して利用しています。
class Array (Ruby 3.0.0 リファレンスマニュアル)
インスタンスメソッド
none? -> bool
none? {|obj| ... } -> bool
none?(pattern) -> bool
- ブロックを指定しない場合、すべての要素が偽であれば真を返し、そうでなければ偽を返す
- ブロックを指定した場合、すべての要素をブロックで評価した結果がすべて偽であれば真を返し、そうでなければ偽を返す
- pattern指定の場合、各要素に対してpattern === itemを評価する
irb(main):001:0> [].none? => true [1] pry(main)> require 'pry-doc' => true [2] pry(main)> show-source Array#none? From: array.c (C Method): Owner: Array Visibility: public Signature: none?(*arg1) Number of lines: 27 static VALUE rb_ary_none_p(int argc, VALUE *argv, VALUE ary) { long i, len = RARRAY_LEN(ary); rb_check_arity(argc, 0, 1); if (!len) return Qtrue; if (argc) { if (rb_block_given_p()) { rb_warn("given block not used"); } for (i = 0; i < RARRAY_LEN(ary); ++i) { if (RTEST(rb_funcall(argv[0], idEqq, 1, RARRAY_AREF(ary, i)))) return Qfalse; } } else if (!rb_block_given_p()) { for (i = 0; i < len; ++i) { if (RTEST(RARRAY_AREF(ary, i))) return Qfalse; } } else { for (i = 0; i < RARRAY_LEN(ary); ++i) { if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) return Qfalse; } } return Qtrue; } # memo # 覚えておきたい。 # [].all?もtrueになる。デフォルトtrueで要素がないからそれが返されるのかな?と思ってソースをみたら、要素がないときは明示的にQtrueを返してた
irb(main):001:0> [nil, false].none? => true irb(main):002:0> [nil, false, 0].none? => false
irb(main):001:0> [10, 15, 20].none? {|n| n > 25 } => true irb(main):002:0> [10, 15, 20].none? {|n| n > 18 } => false
irb(main):001:0> [10, 15, 20].none?(20) => false irb(main):002:0> [10, 15, 20].none?(1) => true irb(main):003:0> [10, 15, 20].none?(Integer) => false irb(main):004:0> [10, 15, 20].none?(String) => true irb(main):005:0> %w[foo bar hoge].none?(/b.*/) => false irb(main):006:0> %w[foo bar hoge].none?(/z.*/) => true
one? -> bool
one? {|obj| ... } -> bool
one?(pattern) -> bool
- ブロックを指定しない場合、ちょうど一つの要素だけが真であれば真を返し、そうでなければ偽を返す
- ブロックを指定した場合、要素をブロックで評価した結果、ちょうど一つの要素だけが真であれば真を返し、そうでなければ偽を返す
- pattern指定の場合、各要素に対してpattern === itemを評価する
irb(main):001:0> [].one? => false [1] pry(main)> require 'pry-doc' => true [2] pry(main)> show-source Array#one? From: array.c (C Method): Owner: Array Visibility: public Signature: one?(*arg1) Number of lines: 37 static VALUE rb_ary_one_p(int argc, VALUE *argv, VALUE ary) { long i, len = RARRAY_LEN(ary); VALUE result = Qfalse; rb_check_arity(argc, 0, 1); if (!len) return Qfalse; if (argc) { if (rb_block_given_p()) { rb_warn("given block not used"); } for (i = 0; i < RARRAY_LEN(ary); ++i) { if (RTEST(rb_funcall(argv[0], idEqq, 1, RARRAY_AREF(ary, i)))) { if (result) return Qfalse; result = Qtrue; } } } else if (!rb_block_given_p()) { for (i = 0; i < len; ++i) { if (RTEST(RARRAY_AREF(ary, i))) { if (result) return Qfalse; result = Qtrue; } } } else { for (i = 0; i < RARRAY_LEN(ary); ++i) { if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) { if (result) return Qfalse; result = Qtrue; } } } return result; } # memo # こちらは要素がないときはQfalseを返している。 # none?とone?の内部実装のスタイルが違うように見える # none?と違って先にデフォルト値の設定をしている(VALUE result = Qfalse;)ので、return resultでいい気がするけど何か理由があるのかな?
irb(main):001:0> [nil, false].one? => false irb(main):002:0> [nil, false, true].one? => true irb(main):003:0> [nil, false, true, 1].one? => false
irb(main):001:0> [10, 15, 20].one? {|n| n > 25 } => false irb(main):002:0> [10, 15, 20].one? {|n| n > 18 } => true irb(main):003:0> [10, 15, 20].one? {|n| n > 13 } => false
irb(main):001:0> %w[foo bar hoge].one?(/z.*/) => false irb(main):002:0> %w[foo bar hoge].one?(/b.*/) => true irb(main):003:0> %w[foo bar hoge].one?(/.*/) => false