Ruby 2.0.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > 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(first, last, exclude_end = false) -> Range
[permalink][rdoc]first から last までの範囲オブジェクトを生成して返しま す。
exclude_end が真ならば終端を含まない範囲オブジェクトを生 成します。exclude_end 省略時には終端を含みます。
self == other -> bool
[permalink][rdoc]指定された other が Range クラスのインスタンスであり、 始点と終点が == メソッドで比較して等しく、Range#exclude_end? が同じ場合に true を返します。そうでない場合に false を返します。
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? を使用してください。
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
[SEE_ALSO] Range#cover?
begin -> object
[permalink][rdoc]first -> object
始端の要素を返します。範囲オブジェクトが始端を含むかどうかは関係ありま せん。
p (1..5).begin # => 1 p (1..0).begin # => 1
first(n) -> [object]
[permalink][rdoc]最初の n 要素を返します。範囲内に要素が含まれない場合は空の配列を返します。
[SEE_ALSO] [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 のインスタンスを返します。
[SEE_ALSO] Array#bsearch
cover?(obj) -> bool
[permalink][rdoc]obj が範囲内に含まれている時に真を返します。
Range#include? と異なり <=> メソッドによる演算により範囲内かどうかを判定します。 Range#include? は原則として離散値を扱い、 Range#cover? は連続値を扱います。 (数値については、例外として Range#include? も連続的に扱います。)
# 数値は連続的に扱われているため、 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)) # => "can't iterate from Time" (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 メソッドを使用してイテレーションするようになりました。
end -> object
[permalink][rdoc]last -> object
終端の要素を返します。範囲オブジェクトが終端を含むかどうかは関係ありま せん。
(10..20).last # => 20 (10...20).last # => 20
last(n) -> [object]
[permalink][rdoc]最後の n 要素を返します。範囲内に要素が含まれない場合は空の配列を返します。
[注意] 引数を省略して実行した場合は、終端を含むかどうか (Range#exclude_end? の戻り値)に関わらず終端の要素を返す事に注意し てください。
(10..20).last(3) # => [18, 19, 20] (10...20).last(3) # => [17, 18, 19]
eql?(other) -> bool
[permalink][rdoc]指定された other が Range クラスのインスタンスであり、 始点と終点が eql? メソッドで比較して等しく、Range#exclude_end? が同じ場合に true を返します。そうでない場合に false を返します。
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
max -> object | nil
[permalink][rdoc]範囲内の最大の値を返します。
該当する要素が存在しなければ nil を返します。
max {|a, b| ... } -> object | nil
[permalink][rdoc]ブロックの評価結果で範囲内の各要素の大小判定を行い、最大の要素を返しま す。範囲内に要素が存在しなければ nil を返します。
ブロックの値は、a > b のとき正、 a == b のとき 0、a < b のとき負の整数 を、期待しています。
[SEE_ALSO] Range#last, Enumerable#max
min -> object | nil
[permalink][rdoc]範囲内の最小の値を返します。
該当する要素が存在しなければ nil を返します。
min {|a, b| ... } -> object | nil
[permalink][rdoc]ブロックの評価結果で範囲内の各要素の大小判定を行い、最小の要素を返しま す。範囲内に要素が存在しなければ nil を返します。
ブロックの値は、a > b のとき正、a == b のとき 0、 a < b のとき負の整数 を、期待しています。
[SEE_ALSO] Range#first, Enumerable#min
size -> Integer | Float::INFINITY | nil
[permalink][rdoc]範囲内の要素数を返します。始端、終端のいずれかのオブジェクトが Numeric のサブクラスのオブジェクトではない場合には nil を返します。
(10..20).size # => 11 ("a".."z").size # => nil
step(s = 1) {|item| ... } -> self
[permalink][rdoc]step(s = 1) -> Enumerator
範囲内の要素を s おきに繰り返します。
("a" .. "f").step(2) {|v| p v} # => "a" "c" "e"
to_s -> String
[permalink][rdoc]self を文字列に変換します(始点と終点のオブジェクトは #to_s メソッドで文 字列に変換されます)。
[SEE_ALSO] Range#inspect