大ちゃんの駆け出し技術ブログ

RUNTEQ受講生のかわいいといわれるアウトプットブログ

【Ruby】?の付くArrayクラスのインスタンスメソッド

はじめに

みなさんこんにちは。大ちゃんの駆け出し技術ブログです。

今回は?がつくArrayクラスのメソッドです。基本的には簡単なものが多いです。

all?

レシーバーである配列の要素が全て真であればtrueを返却し、要素の中に一つでも偽である要素があればfalseを返すメソッドです。極端にいうと下のような感じ。

[true, true, true].all? # => true
[true, false, true].all? # => true

単体だとあまり使い勝手が良くありませんが、ブロックを渡すとかなり便利に使用できます。

例えば、全ての配列の要素が0より大きい数字であればtrueを、一つでも負の数があればfalseを返して欲しいとします。様々な方法が考えられますが、無理やり下記のように実装してみましょう。

result = true
[1, 2, 3].each do |num|
  if num < 0
    result = false
    break
  end
end

一つでも負の数があればfalseを返して繰り返し処理を終了する処理です。確かにこれでも実装できますが少々コードの記述が多くなってしまいます。

上記のコードをall?メソッドにブロックを渡して実装してみます。

[1, 2, 3].all? { |num| num > 0 } 

これで上述したコードと同じような処理になります。条件式でブロックを渡すことで各配列の要素をその条件式に代入することができます。

空の配列に対してall?メソッドを使用する場合はtrueを返します。

[].all? # => true
[].all? {|num| num > 0 } # => true

any?

全ての要素がfalseの場合にのみfalseを返します。どれか一つの要素がtrueの場合直ちにtrueを返します。挙動としてはall?と似ていますが、all?の場合は全ての要素が&&演算子のようにtrueでなければいけませんが、any?の場合は||演算子のようにどれか一つでもtrueであればtrueを返します。

[-1, -2, 3].any? { |num| num > 0 } # => true

空の配列に対してany?メソッドを使用する場合はfalseを返します。

[].any? # => false
[].any? {|num| num > 0 } # => false

empty?

レシーバーの配列の要素数が0の場合はtrue、そうでなければfalseを返却します。

[].empty? # => true
[1].empty? # => false

empty?は配列だけでなく、Stringクラスのインスタンスメソッドでもあります。文字数が0の時だけtrue、それ以外はfalseを返します。

"111111".empty?   #=> false
" ".empty?       #=> false
"".empty?        #=> true

eql?(array)

レシーバーと引数の配列が等しいかどうかを真偽値で返すメソッドです。要素が同じでも配列の順番が違えば異なる配列とみなされます。

[1,2,3].eql? [1,2,3] # => true
[1,2,3].eql? [1,3,2] # => false

eql?メソッドはIntegerにもStringにもインタンスメソッドとして定義されています。

"a".eql?("a") # => true

include?(val)

引数のvalと等しい要素がレシーバーの配列に含まれている場合にtrue、含まれていない場合はfalseを返します。

[1,2,3].include?(1) # => true
[1,2,3].include?(0) # => false

引数は一つしか指定できないので注意してください。2つの要素が含まれているか確認したい場合は2回include?メソッドを呼び出します。

[1,2,3].include?(0,1)
# ArgumentError (wrong number of arguments (given 2, expected 1))

[1,2,3].include?(1) && [1,2,3].include?(0)
# => false

none?

これは完全にall?の逆です。全ての要素がfalseであればtrueを返します。逆に一つでもtrueの要素があればfalseを返します。少しややこしいですね。

[false, false, false].none? # => true
[false, false, true].none? # => false

ブロックを渡せばall?と同様に条件式を渡すことができます。

[1, 2, 3].none? { |num| num < 0 }  # => true

one?

今まで紹介きたメソッドと似ていますが、一つの要素だけ真だった場合にtrue、それ以外はfalseを返すメソッドです。

[false, false, true].one? # => true
[false, true, true].one? # => false
[false, false, false].one? # => false

一つの要素だけが真であることを確認するために処理は2つ目の真の値が確認されるまで続きます。