Ruby 2.2.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Rangeクラス

class Range

クラスの継承リスト: Range < Enumerable < Object < Kernel < BasicObject

要約

範囲オブジェクトのクラス。範囲オブジェクトは範囲演算子 .. または ... によって生成されます。.. 演算子によって生成された範囲 オブジェクトは終端を含み、... 演算子によって生成された範囲オブジェ クトは終端を含みません。

for i in 1..5
   # 処理
end

これは 1 から 5 までの範囲オブジェクトを生成して、それぞれの値に対して 繰り返すと言う意味です。

範囲演算子のオペランドは互いに <=> で比較できる必要があります。 さらに Range#each を実行するためには succ メソッ ドを実行できるものでなければいけません。

破壊的な変更

Ruby の Range クラスは immutable です。 つまり、オブジェクト自体を破壊的に変更することはできません。 ですので、一度生成された Range のオブジェクトの指し示す範囲は 決して変更することはできません。

range = 1..10
range.first     # => 1
range.first = 1 # => NoMethodError

目次

特異メソッド
new
インスタンスメソッド
== === include? member? begin first bsearch cover? each end last eql? exclude_end? hash inspect max min size step to_s

特異メソッド

new(first, last, exclude_end = false) -> Range[permalink][rdoc]

first から last までの範囲オブジェクトを生成して返しま す。

exclude_end が真ならば終端を含まない範囲オブジェクトを生 成します。exclude_end 省略時には終端を含みます。

[PARAM] first:
最初のオブジェクト
[PARAM] last:
最後のオブジェクト
[PARAM] exclude_end:
真をセットした場合終端を含まない範囲オブジェクトを生成します
[EXCEPTION] ArgumentError:
first <=> last が nil の場合に発生します

例: 整数の範囲オブジェクトの場合

Range.new(1, 10)       # => 1..10
Range.new(1, 10, true) # => 1...10

例: 日付オブジェクトの範囲オブジェクトの場合

require 'date'
Range.new(Date.today, Date.today >> 1).each {|d| puts d }
# => 2017-09-16
     2017-09-17
     ...
     2017-10-16

例: IPアドレスの範囲オブジェクトの場合

require 'ipaddr'
Range.new(IPAddr.new("192.0.2.1"), IPAddr.new("192.0.2.3")).each {|ip| puts ip}
# => 192.0.2.1
     192.0.2.2
     192.0.2.3

例: 自作のオブジェクトの場合

MyInteger = Struct.new(:value) do
  def succ
    self.class.new(value + 1)
  end

  def <=>(other)
    value <=> other.value
  end

  def to_s
    value.to_s
  end
end
Range.new(MyInteger.new(1), MyInteger.new(3)).each {|i| puts i }
# => 1
     2
     3

インスタンスメソッド

self == other -> bool[permalink][rdoc]

指定された other が Range クラスのインスタンスであり、 始端と終端が == メソッドで比較して等しく、Range#exclude_end? が同じ場合に true を返します。そうでない場合に false を返します。

[PARAM] other:
自身と比較したいオブジェクトを指定します。

例:

p (1..2) == (1..2)               # => true
p (1..2) == (1...2)              # => false
p (1..2) == Range.new(1.0, 2.0)  # => true
self === obj -> bool[permalink][rdoc]
include?(obj) -> bool
member?(obj) -> bool

obj が範囲内に含まれている時に真を返します。

Range#=== は主に case 式での比較に用いられます。

<=> メソッドによる演算により範囲内かどうかを判定するには Range#cover? を使用してください。

[PARAM] obj:
比較対象のオブジェクトを指定します。

例:

p (0.1 .. 0.2).member?(0.15)  # => true

# 文字列の場合、include? は辞書順の比較になる
p ("a" .. "c").include?("ba") # => false
p ("a" .. "c").member?("ba")  # => false

[SEE_ALSO] 制御構造/case

[SEE_ALSO] Range#cover?

begin -> object[permalink][rdoc]
first -> object

始端の要素を返します。範囲オブジェクトが始端を含むかどうかは関係ありま せん。

例:

p (1..5).begin # => 1
p (1..0).begin # => 1

[SEE_ALSO] Range#end

first(n) -> [object][permalink][rdoc]

最初の n 要素を返します。範囲内に要素が含まれない場合は空の配列を返します。

[PARAM] n:
取得する要素数を整数で指定します。整数以外のオブジェクトを指定 した場合は to_int メソッドによる暗黙の型変換を試みます。
[EXCEPTION] TypeError:
引数に整数以外の(暗黙の型変換が行えない)オブジェクトを 指定した場合に発生します。
[EXCEPTION] ArgumentError:
n に負の数を指定した場合に発生します。

例:

(10..20).first(3)  # => [10, 11, 12]

[SEE_ALSO] Range#last, [ruby-core:12697]

bsearch {|obj| ... } -> object | nil[permalink][rdoc]
bsearch -> Enumerator

ブロックの評価結果で範囲内の各要素の大小判定を行い、条件を満たす値を二 分探索(計算量は O(log n))で検索します。要素が見つからない場合は nil を 返します。

本メソッドはブロックを評価した結果により以下のいずれかのモードで動作し ます。

find-minimum モード(特に理由がない限りはこのモードを使う方がいいでしょ う)では、条件判定の結果を以下のようにする必要があります。

ブロックの評価結果が true になる最初の要素を返すか、nil を返します。

例:

ary = [0, 4, 7, 10, 12]
(0...ary.size).bsearch {|i| ary[i] >= 4 } # => 1
(0...ary.size).bsearch {|i| ary[i] >= 6 } # => 2
(0...ary.size).bsearch {|i| ary[i] >= 8 } # => 3
(0...ary.size).bsearch {|i| ary[i] >= 100 } # => nil

(0.0...Float::INFINITY).bsearch {|x| Math.log(x) >= 0 } # => 1.0

find-any モードは bsearch(3) のように動作します。ブロックは真偽値 ではなく、以下のような数値を返す必要があります。求める値の範囲がx...y (x <= y)であるとします。また、ブロックパラメータの値を v とします。

ブロックの評価結果が 0 になるいずれかの要素を返すか、nil を返します。

例:

ary = [0, 100, 100, 100, 200]
(0..4).bsearch {|i| 100 - ary[i] } # => 1, 2 or 3
(0..4).bsearch {|i| 300 - ary[i] } # => nil
(0..4).bsearch {|i|  50 - ary[i] } # => nil

上記の 2 つのモードを混在して使用しないでください(ブロックの評価結果は 常に true/false、数値のいずれかを一貫して返すようにしてください)。 また、二分探索の各イテレーションで値がどのような順序で選ばれるかは 未規定です。

ブロックが与えられなかった場合は、 Enumerator のインスタンスを返します。

[EXCEPTION] TypeError:
ブロックの評価結果が true、false、nil、数値以外であっ た場合に発生します。

[SEE_ALSO] Array#bsearch

cover?(obj) -> bool[permalink][rdoc]

obj が範囲内に含まれている時に真を返します。

Range#include? と異なり <=> メソッドによる演算により範囲内かどうかを判定します。 Range#include? は原則として離散値を扱い、 Range#cover? は連続値を扱います。 (数値については、例外として Range#include? も連続的に扱います。)

[PARAM] obj:
比較対象のオブジェクトを指定します。

例:

# 数値は連続的に扱われているため、 include? / cover? が同じ結果を返す
(1.1..2.3).include?(1.0)    # => false
(1.1..2.3).include?(1.1)    # => true
(1.1..2.3).include?(1.555)  # => true
(1.1..2.3).cover?(1.0)      # => false
(1.1..2.3).cover?(1.1)      # => true
(1.1..2.3).cover?(1.555)    # => true

# String の例
('b'..'d').include?('d')    # => true
('b'..'d').include?('ba')   # => false
('b'..'d').cover?('d')      # => true
('b'..'d').cover?('ba')     # => true

# Date, DateTime の例
(Date.new(2014,1,3)..Date.new(2014,1,5)).include?(Date.new(2014,1,5))           # => true
(Time.new(2014,1,3)..Time.new(2014,1,5)).include?(Time.new(2014,1,4,10,10,10))  # => true
(Date.new(2014,1,3)..Date.new(2014,1,5)).cover?(Date.new(2014,1,5))             # => true
(Time.new(2014,1,3)..Time.new(2014,1,5)).cover?(Time.new(2014,1,4,10,10,10))    # => true

[SEE_ALSO] Range#include?

each {|item| ... } -> self[permalink][rdoc]
each -> Enumerator

範囲内の要素に対して繰り返します。

Range#each は各要素の succ メソッドを使用してイテレーションするようになりました。

[EXCEPTION] TypeError:
succ メソッドを持たないクラスの範囲オブジェクトに対してこのメソッドを呼んだ場合に発生します。

例:

(10..15).each {|n| print n, ' ' }
# prints: 10 11 12 13 14 15

(2.5..5).each {|n| print n, ' ' }
# raises: TypeError: can't iterate from Float
end -> object[permalink][rdoc]
last -> object

終端の要素を返します。範囲オブジェクトが終端を含むかどうかは関係ありま せん。

例:

(10..20).last      # => 20
(10...20).last     # => 20

[SEE_ALSO] Range#begin

last(n) -> [object][permalink][rdoc]

最後の n 要素を返します。範囲内に要素が含まれない場合は空の配列を返します。

[PARAM] n:
取得する要素数を整数で指定します。整数以外のオブジェクトを指定 した場合は to_int メソッドによる暗黙の型変換を試みます。
[EXCEPTION] TypeError:
引数に整数以外の(暗黙の型変換が行えない)オブジェクトを 指定した場合に発生します。
[EXCEPTION] ArgumentError:
n に負の数を指定した場合に発生します。

[注意] 引数を省略して実行した場合は、終端を含むかどうか (Range#exclude_end? の戻り値)に関わらず終端の要素を返す事に注意し てください。

例:

(10..20).last(3)   # => [18, 19, 20]
(10...20).last(3)  # => [17, 18, 19]

[SEE_ALSO] Range#first

eql?(other) -> bool[permalink][rdoc]

指定された other が Range クラスのインスタンスであり、 始端と終端が eql? メソッドで比較して等しく、Range#exclude_end? が同じ場合に true を返します。そうでない場合に false を返します。

[PARAM] other:
自身と比較したいオブジェクトを指定します。

例:

p (1..2).eql?(1..2)                 # => true
p (1..2).eql?(1...2)                # => false
p (1..2).eql?(Range.new(1.0, 2.0))  # => false
exclude_end? -> bool[permalink][rdoc]

範囲オブジェクトが終端を含まないとき真を返します。

例:

(1..5).exclude_end?     # => false
(1...5).exclude_end?    # => true
hash -> Integer[permalink][rdoc]

始端と終端のハッシュ値と Range#exclude_end? の値からハッシュ値を計算して整数として返します。

例:

p (1..2).hash    # => 5646
p (1...2).hash   # => 16782863
inspect -> String[permalink][rdoc]

self を文字列に変換します(始端と終端のオブジェクトは #inspect メソッド で文字列に変換されます)。

[SEE_ALSO] Range#to_s

例:

(1..5).inspect      # => "1..5"
("1".."5").inspect  # => "\"1\"..\"5\""
max -> object | nil[permalink][rdoc]

範囲内の最大の値を返します。

例:

(1..5).max  # => 5

始端が終端より大きい場合、終端を含まない範囲オブジェクトの始端が終端と 等しい場合は nil を返します。

例:

(2..1).max  # => nil
(1...1).max # => nil
max {|a, b| ... } -> object | nil[permalink][rdoc]

ブロックの評価結果で範囲内の各要素の大小判定を行い、最大の要素を返しま す。範囲内に要素が存在しなければ nil を返します。

ブロックの値は、a > b のとき正、 a == b のとき 0、a < b のとき負の整数 を、期待しています。

[EXCEPTION] TypeError:
ブロックが整数以外を返したときに発生します。

[SEE_ALSO] Range#last, Range#min, Enumerable#max

例:

h = { 1 => "C", 2 => "Go", 3 => "Ruby" }
(1..3).max { |a, b| h[a].length <=> h[b].length }   # => 3
min -> object | nil[permalink][rdoc]

範囲内の最小の値を返します。

例:

(1..5).min # => 1

始端が終端より大きい場合、終端を含まない範囲オブジェクトの始端が終端と 等しい場合は nil を返します。

例:

(2..1).min  # => nil
(1...1).min # => nil
min {|a, b| ... } -> object | nil[permalink][rdoc]

ブロックの評価結果で範囲内の各要素の大小判定を行い、最小の要素を返しま す。範囲内に要素が存在しなければ nil を返します。

ブロックの値は、a > b のとき正、a == b のとき 0、 a < b のとき負の整数 を、期待しています。

[EXCEPTION] TypeError:
ブロックが整数以外を返したときに発生します。

[SEE_ALSO] Range#first, Range#max, Enumerable#min

例:

h = { 1 => "C", 2 => "Go", 3 => "Ruby" }
(1..3).min { |a, b| h[a].length <=> h[b].length }   # => 1
size -> Integer | Float::INFINITY | nil[permalink][rdoc]

範囲内の要素数を返します。始端、終端のいずれかのオブジェクトが Numeric のサブクラスのオブジェクトではない場合には nil を返します。

例:

(10..20).size    # => 11
("a".."z").size  # => nil
(-Float::INFINITY..Float::INFINITY).size # => Infinity
step(s = 1) {|item| ... } -> self[permalink][rdoc]
step(s = 1) -> Enumerator

範囲内の要素を s おきに繰り返します。

[PARAM] s:
正の整数を指定します。
[EXCEPTION] ArgumentError:
s に 0 または負の数を指定した場合に発生します

例:

("a" .. "f").step(2) {|v| p v}
# => "a"
     "c"
     "e"
to_s -> String[permalink][rdoc]

self を文字列に変換します(始端と終端のオブジェクトは #to_s メソッドで文 字列に変換されます)。

[SEE_ALSO] Range#inspect

例:

(1..5).to_s      # => "1..5"
("1".."5").to_s  # => "1..5"