.NET開発者のためのブログメディア

Rubyの範囲オブジェクトとは?詳しい内容をご紹介!
目次
Rubyの範囲オブジェクトについて
今回は、Rubyの範囲オブジェクト(Rangeオブジェクト)について説明します。Rubyの範囲オブジェクトとは、範囲を表すためのオブジェクトです。
作成方法や扱い方、注意点についてまとめました。Rubyの範囲オブジェクトに興味のある方はぜひご覧ください。
範囲オブジェクトの作成(..)
Rubyの範囲オブジェクトは「first..last」で作成できます。firstは範囲開始値、lastは範囲終了値で、firstからlastまでの値の範囲を表します。また、firstとlastは大小の比較ができるものでなければなりません。そのため、数値・文字・日付の範囲などを扱えます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
require 'date' # 日付を扱うために必要 range1 = 1..5 range2 = 'a'..'e' range3 = Date.parse(""2020-06-01"")..Date.parse(""2020-06-05"") puts range1 puts range2 puts range3 |
実行結果は以下のようになります。
1 2 3 |
1..5 a..e 2020-06-01..2020-06-05 |
Rubyに正しく認識されていることが分かります。
また、範囲オブジェクトは「…」でも作成できます。
この場合、lastはオブジェクトに含みません。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
require 'date' # 日付を扱うために必要 range1 = 1...5 range2 = 'a'...'e' range3 = Date.parse(""2020-06-01"")...Date.parse(""2020-06-05"") puts range1 puts range2 puts range3 |
実行結果は以下のようになります。
1 2 3 |
1...5 a...e 2020-06-01...2020-06-05 |
このように、Rubyの範囲オブジェクトは「..」または「…」で作成できます。
範囲オブジェクトの作成(Range)
Rubyの範囲オブジェクトは、Rangeクラスの「new」メソッドで作成できます。
以下のように記述します。
Range.new(first, last[, exclude_end])
exclude_endは、範囲にlastを含むか否かを指定する引数で、省略できます。
・true : lastを含まない
・false : lastを含む
省略した場合は、falseと同じです。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
require 'date' # 日付を扱うために必要 range1 = Range.new(1, 5) range2 = Range.new(1, 5, true) range3 = Range.new(1, 5, false) range4 = Range.new('a', 'e') range5 = Range.new('a', 'e', true) range6 = Range.new('a', 'e', false) range7 = Range.new(Date.parse(""2020-06-01""), Date.parse(""2020-06-05"")) range8 = Range.new(Date.parse(""2020-06-01""), Date.parse(""2020-06-05""), true) range9 = Range.new(Date.parse(""2020-06-01""), Date.parse(""2020-06-05""), false) puts range1 puts range2 puts range3 puts range4 puts range5 puts range6 puts range7 puts range8 puts range9 |
実行結果は以下のようになります。
1 2 3 4 5 6 7 8 9 |
1..5 1...5 1..5 a..e a...e a..e 2020-06-01..2020-06-05 2020-06-01...2020-06-05 2020-06-01..2020-06-05 |
このように、Rubyの範囲オブジェクトはRange.new()でも作成できます。
範囲オブジェクトの繰り返し処理(each)
範囲オブジェクトは、each文で繰り返し処理ができます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
require 'date' # 日付を扱うために必要 range1 = Range.new(1, 5) range2 = Range.new('a', 'e') range3 = Range.new(Date.parse(""2020-06-01""), Date.parse(""2020-06-05"")) # 数字の繰り返し range1.each do |i| puts i end # 文字の繰り返し range2.each do |i| puts i end # 日付の繰り返し range3.each do |i| puts i end |
実行結果は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
1 2 3 4 5 a b c d e 2020-06-01 2020-06-02 2020-06-03 2020-06-04 2020-06-05 |
このように、each文で繰り返し処理ができます。
また、eachの代わりにreverse_eachを使用すると、逆順に繰り返し処理ができます。
範囲オブジェクトの繰り返し処理(for)
範囲オブジェクトは、for文で繰り返し処理ができます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
require 'date' # 日付を扱うために必要 range1 = Range.new(1, 5, true) range2 = Range.new('a', 'e', true) range3 = Range.new(Date.parse(""2020-06-01""), Date.parse(""2020-06-05""), true) # 数字の繰り返し for i in range1 puts i end # 文字の繰り返し for i in range2 puts i end # 日付の繰り返し for i in range3 puts i end |
実行結果は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 |
1 2 3 4 a b c d 2020-06-01 2020-06-02 2020-06-03 2020-06-04 |
exclude_endにtrueを指定しているので、lastが含まれていないことが分かります。このように、for文で繰り返し処理ができます。
範囲オブジェクトの要素数
範囲オブジェクトの要素数は、sizeメソッドで取得できます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
require 'date' # 日付を扱うために必要 range1 = Range.new(1, 5) range2 = Range.new(1, 5, true) range3 = Range.new(1, 5, false) range4 = Range.new('a', 'e') range5 = Range.new('a', 'e', true) range6 = Range.new('a', 'e', false) range7 = Range.new(Date.parse(""2020-06-01""), Date.parse(""2020-06-05"")) range8 = Range.new(Date.parse(""2020-06-01""), Date.parse(""2020-06-05""), true) range9 = Range.new(Date.parse(""2020-06-01""), Date.parse(""2020-06-05""), false) puts ""数字の範囲オブジェクト 要素数"" puts range1.size puts range2.size puts range3.size puts ""文字の範囲オブジェクト 要素数"" puts range4.size puts range5.size puts range6.size puts ""日付の範囲オブジェクト 要素数"" puts range7.size puts range8.size puts range9.size puts ""終了"" |
実行結果は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
数字の範囲オブジェクト 要素数 5 4 5 文字の範囲オブジェクト 要素数 日付の範囲オブジェクト 要素数 終了 |
sizeメソッドはfirst、lastのいずれかのオブジェクトがNumericクラスのオブジェクトではない場合、nilを返します。そのため、range1~range3の要素数のみが出力されます。
範囲オブジェクトの比較(include?)
範囲オブジェクトに要素が含まれているか否か、include?で比較できます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
require 'date' # 日付を扱うために必要 range1 = Range.new(1, 5) range2 = Range.new('a', 'e') range3 = Range.new(Date.parse(""2020-06-01""), Date.parse(""2020-06-05"")) puts range1.include? 3 puts range1.include? 6 puts range2.include? 'b' puts range2.include? 'g' puts range3.include? Date.parse(""2020-06-01"") puts range3.include? Date.parse(""2020-06-06"") |
実行結果は以下のようになります。
1 2 3 4 5 6 |
true false true false true false |
このように、範囲オブジェクトに要素が含まれているか否か、include?で比較できます。
範囲オブジェクトの比較(===)
範囲オブジェクトに要素が含まれているか否か、「===」でも比較できます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
require 'date' # 日付を扱うために必要 range1 = Range.new(1, 5) range2 = Range.new('a', 'e') range3 = Range.new(Date.parse(""2020-06-01""), Date.parse(""2020-06-05"")) puts range1 === 3 puts range1 === 6 puts range2 === 'b' puts range2 === 'g' puts range3 === Date.parse(""2020-06-01"") puts range3 === Date.parse(""2020-06-06"") |
実行結果は以下のようになります。
1 2 3 4 5 6 |
true false true false true false |
このように、範囲オブジェクトに要素が含まれているか否か、「===」でも比較できます。
Rubyの範囲オブジェクトを理解しよう
Rubyの範囲オブジェクト(Rangeオブジェクト)は、範囲を表すためのオブジェクトで、その作成方法や扱い方について説明しましたが、いかがでしたでしょうか。
作成した範囲オブジェクトに対して、繰り返し処理や検索処理ができます。ぜひご自身でソースコードを書いて、Rubyについて理解を深めてください。