範囲オブジェクトのクラス。範囲オブジェクトは範囲演算子 ..
または
...
によって生成されます。..
演算子によって生成された範囲
オブジェクトは終端を含み、...
演算子によって生成された範囲オブジェ
クトは終端を含みません。
例:
for i in 1..5 ... end
これは 1 から 5 までの範囲オブジェクトを生成して、それぞれの値に対して 繰り返すと言う意味です。
範囲演算子のオペランドは互いに <=>
で比較できる必要があります。
さらに Range#each を実行するためには succ
メソッ
ドを実行できるものでなければいけません。
*1
Range.new(first,last[, exclude_end])
first から last までの範囲オブジェクトを生成して返しま す。exclude_end は終端を含むかどうかを指定します。省略時には 終端を含みます。
生成時に、引数の正当性チェックとして
first <=> last
を実行する。これが例外を返す場合、例外 ArgumentError を発生 させる。(ruby 1.7 feature: version 1.7 ではさらに first.succ を実行して例外が発生しないか確認する)
self === other
このメソッドは主に case 文での比較に用いられます。 other が範囲内に含まれている時に真を返します。
begin
first
最初の要素を返します。
each{|item| ... }
範囲内の要素に対して繰り返します。
end
last
終端を返します。範囲オブジェクトが終端を含むかどうかは関係ありませ ん。
p (1..5).end # => 5 p (1...5).end # => 5
exclude_end?
範囲オブジェクトが終端を含まないとき真を返します。
length
size
範囲の長さ(last - first + (exclude_end? ? 0 : 1))を返します。 *2
step(s) {|item| ... }
範囲内の要素を s おきに繰り返します。 *3
("a" .. "f").step(2) {|v| p v} # => "a" "c" "e"
to_ary
to_a と同じです。範囲内の個々の値を要素とする配列 を返します。多重代入などで暗黙の型変換(配列化)が起こります。
a,b,c = (1..3) p [a,b,c] #=> [1, 2, 3]
*1あらい 2002-01-13: 正確には、each できるためには繰り返される要素は
終端と <=
あるいは、<
メソッドで比較できる必要がある(なぜ
か <=>
ではない)。さらに、Numeric のサブクラスであれば
to_i
メソッドによりInteger のサブクラスにならなくてはなら
ず。これは、+ 1
(なぜか succ
ではない)を受け付けなくてはな
らない。また、===
で Range
オブジェクトの範囲内かどうかを
調べられるためには両端のオブジェクトが <=
, >
, >=
を
持たなくてはならない(なぜか <=>
ではない)。このマニュアルの記述
内容に反して <=>
メソッドを持つかどうかは Range
オブジェク
トを生成する際にチェックされるが直接は利用されない(Comparable 想
定しているのだろうか?)。この記述は、version 1.6.6 2002-01-11 のソース
を元に書いている。勘違いがあれば突っ込んで欲しい
*2あらい 2002-01-13: あっ、これもだ。この式が実行できなければ
size は動作しない
*3あらい 2002-01-13: もちろん Numeric のサブクラスであれば
item + s が動作しなければならない。それ以外では succ
を s 回実行する。つまり s は、整数でなければならない