範囲オブジェクト
範囲オブジェクトは指定した最初の値と最後の値の範囲を表すオブジェクトです。範囲オブジェクトは繰り返し処理と一緒に使用して順に値を取得したり、ある値が範囲内に含まれているかどうかを調べるために使われます。ここでは特に繰り返し処理を一緒に使用する場合に限定して確認します。
範囲オブジェクトを作成するには「..」演算子を使用します。
first..last
「..」演算子の左辺に最初の値を指定し右辺に最後の値を指定します。最初と最後の値には数値や文字列などのオブジェクトが指定できます。
具体的には次のように使用します。
range1 = 5..10 range2 = "d".."g"
変数「range1」には「5」から「10」の範囲を持つ範囲オブジェクトが代入されます。また変数「range2」には"d"から"g"の範囲を持つ範囲オブジェクトが代入されます。
最初と最後の値には任意のオブジェクトが指定できますが、最初と最後の値は大きいか小さいか等しいかなどの比較が出来るものでなければなりません。数値と数値、文字列と文字列などが一般的には利用されることが多いです。
なおよく似た演算子として「...」演算子が用意されています。
first...last
この場合、範囲オブジェクトが持つ範囲に最後の値は含まれません。
Rangeクラス
範囲オブジェクトは実際にはRangeクラスのオブジェクトです。「..」演算子や「...」演算子によって範囲オブジェクトを作成できますが、Rangeクラスのクラスメソッドである「new」メソッドでも作成できます。
Range.new(first,last[, exclude_end])
「first」には最初の値を、「last」には最後の値を指定します。また「exclude_end」は最後の値を要素として含めるかどうかを指定します。真の値を指定した場合は最後の値を含めません。省略された場合は最後の値を含めます。
具体的には次のように使用します。
range1 = Range.new(5, 10) range2 = Range.new(5, 10, true)
作成される範囲オブジェクトは「..」演算子と「...」演算子を使用した場合と同じです。
範囲オブジェクトを繰り返し処理で使用する場合の注意点
範囲オブジェクトを「for」文の中で使用した場合、最初の値から最後の値まで(「..」演算子の場合)順に値を取り出し要素として返します。取り出す方法は最初と最後に指定したオブジェクトの元になっているクラスで定義されている「succ」メソッドを使われます。
「succ」メソッドがどのような値を返すのかはクラスによって異なります。ここでは数値オブジェクトと文字列オブジェクトを指定した場合を確認しておきます。
数値オブジェクトが最初と最後に指定されている場合は、最初の値から最後の値まで1ずつ加算した値を要素として返します。
1.succ -> 2 99.succ -> 100 -5.succ -> -4
実際には次のように使います。
for num in 3..5 do print(num, "¥n") end
上記の場合は「3」「4」「5」と順に出力されます。
文字列オブジェクトが最初と最後に指定されている場合は、アルファベットについてはを(アルファベットだけの)26進数として扱い、数値は10進数として扱って次の値を要素として返します。
"a".succ -> "b" "z".succ -> "aa" "Ad".succ -> "Ae" "Az".succ -> "Ba" "zz".succ -> "aaa" "4".succ -> "5" "9".succ -> "10" "a9".succ -> "b0" "9z".succ -> "10a"
文字列にアルファベットや数値が含まれる時にその他の文字も含まれる場合はその他の文字はそのまま変わりません。
"4:5:9".succ -> "4:6:0" "-5".succ -> "-6"
実際には次のように使います。
for num in "a".."d" do print(num, "¥n") end
上記の場合は「a」「b」「c」「d」と順に出力されます。
なお、「succ」メソッドが定義されていないクラスのオブジェクトは最初と最後の値として指定できません。(範囲オブジェクトとしては作成出来ますが、「for」文などに使うとエラーとなります)。浮動小数点数を表すFloatクラスでは「succ」メソッドが定義されていませんので浮動小数点数で指定された範囲オブジェクトは繰り返し処理の中で指定できません。
また最初の値が最後の値よりも大きい範囲オブジェクトも作成できますが、「for」文の中で指定しても要素を1つも返しません(最初の値も返しません)。
サンプルプログラム
では簡単なプログラムで確認して見ます。
#! ruby -Ku print("18..20 is ¥n") for num in 18..20 do print("num = ", num, "¥n") end print("18...20 is ¥n") for num in 18...20 do print("num = ", num, "¥n") end print("¥"Ax¥"..¥"Bc¥" is ¥n") for str in "Ax".."Bb" do print("str = " + str + "¥n") end
上記のプログラムを「test4-1.rb」として保存します。文字コードはUTF-8です。そして下記のように実行して下さい。
( Written by Tatsuo Ikura )