Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. 範囲.to_a / include? / cover? / each

範囲.to_a / include? / cover? / each

範囲オブジェクト(Range)の基本操作メソッドです。配列への変換、要素の存在確認、値が範囲内かどうかの判定ができます。

構文
# 範囲オブジェクトの作成。
(start..stop)    # start から stop を含む範囲(終端を含む)。
(start...stop)   # start から stop を含まない範囲(終端を含まない)。

# 配列に変換します。
範囲.to_a

# 要素が含まれるか判定します(各要素と比較)。
範囲.include?(値)
範囲.member?(値)  # include? の別名

# 値が範囲内かどうか判定します(比較演算子を使用、より高速)。
範囲.cover?(値)

# 最初・最後の要素を返します。
範囲.first
範囲.first(n)  # 最初のn個を配列で返します。
範囲.last
範囲.last(n)   # 最後のn個を配列で返します。

# 各要素を順に処理します。
範囲.each { |要素| 処理 }
メソッド一覧
メソッド概要
to_a範囲内の全要素を配列に変換して返します。
include?(val)valが範囲に含まれるか判定します。各要素と順に比較します。
member?(val)『include?』の別名です。
cover?(val)valが範囲内にあるか比較演算子で判定します。要素を列挙せず高速です。
first範囲の最初の要素を返します。
first(n)範囲の最初のn個の要素を配列で返します。
last範囲の最後の要素を返します(終端を含む範囲のみ)。
each { |e| }範囲の各要素をブロックに渡して繰り返します。
サンプルコード
# 範囲オブジェクトの作成。
整数範囲 = (1..5)
排他範囲 = (1...5)

# to_a で配列に変換します。
puts 整数範囲.to_a.inspect  # [1, 2, 3, 4, 5]
puts 排他範囲.to_a.inspect  # [1, 2, 3, 4](5を含まない)

# アルファベットの範囲も使えます。
puts ("a".."e").to_a.inspect  # ["a", "b", "c", "d", "e"]

# include? で存在確認。
puts (1..10).include?(5)   # true
puts (1..10).include?(11)  # false

# cover? は比較演算子ベースで判定(浮動小数点にも有効)。
puts (1..10).cover?(5.5)   # true(include? では false になる場合あり)
puts ("a".."z").cover?("m")  # true

# each でループ処理。
(1..3).each { |i| print "#{i} " }
puts  # 1 2 3

# first / last。
puts (1..10).first    # 1
puts (1..10).first(3).inspect  # [1, 2, 3]
puts (1..10).last     # 10
puts (1..10).last(3).inspect   # [8, 9, 10]
概要

Rubyの範囲オブジェクト(Range)は『..』(終端を含む)と『...』(終端を含まない)の2種類があります。整数だけでなく文字列や日付など『Comparable』モジュールを含むオブジェクトなら範囲を作れます。

『include?』と『cover?』の違いに注意してください。『include?』は各要素と順に比較するため、浮動小数点や日付の中間値に対して正確に動作しないことがあります。一方『cover?』は比較演算子(<=>)だけを使うため高速で、連続的な値の範囲確認に適しています。

終端を含まない範囲(『...』)で『last』を呼び出すと、最後の要素(終端の1つ前)ではなく終端値そのものが返ります。混乱しやすいため注意してください。

範囲の集計操作は『範囲.min / max / sum / step』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。