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