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

class Range

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

要約

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

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 each end last eql? exclude_end? hash inspect 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 の場合に発生します

インスタンスメソッド

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 式での比較に用いられます。

include? が、Enumerable#include?,Enumerable#member? と異なり <=> メソッドによる演算により範囲内かどうかを判定することに注意する必要があります。

[PARAM] obj:
比較対象のオブジェクトを指定します。
p (0.1 .. 0.2).include?(0.15) # => true
# 1.8.1 以前
p (0.1 .. 0.2).member?(0.15)  # => cannot iterate from Float (TypeError)
# 1.8.2 以降
p (0.1 .. 0.2).member?(0.15)  # => true

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

[SEE_ALSO] 制御構造/case

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

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

p (1..5).begin # => 1
p (1..0).begin # => 1
each {|item| ... } -> self[permalink][rdoc]
each -> Enumerable::Enumerator

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

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

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

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

(10..20).last      # => 20
(10...20).last     # => 20
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]

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

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

step(s = 1) {|item| ... } -> self[permalink][rdoc]
step(s = 1) -> Enumerable::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