Rubyの範囲オブジェクトとは?繰り返しや比較など使い方を解説
- システム
エンジニア - Rubyのコードで日付を指定通りに扱う方法はありますか。
- プロジェクト
マネージャー - 数値や日付を扱うときには、範囲オブジェクトを使ってみましょう。
そもそもオブジェクトとは
オブジェクトとは、オブジェクト指向という言葉で頻繁に利用される言葉です。
オブジェクト指向というのは、共通点や関連性があるデータやメソッドをまとめて管理して行う管理手法です。操作対象に重きを置いた設計のことをオブジェクト指向言語と呼び、Rubyはオブジェクト指向言語です。
今はオブジェクト指向言語が主流なので、Rubyを学んでおいて損はありません。
Rubyの範囲オブジェクトについて
Rubyにおける範囲オブジェクトとは、最初の値と最後の値の範囲を示すものです。範囲は数値の範囲から文字の範囲、日付の範囲などを指定できます。
範囲オブジェクトを指定する場合は、Range.new もしくは「..」、「…」という範囲式を使用することで簡単に連続する値が作成できます。「..」の場合は終端を含みますが「…」の場合は終端を含まないという違いがあります。
範囲オブジェクトが使われるケース
順番に値を取得する場合や、値が範囲内に含まれているかどうかの確認などに利用されます。
for文による繰り返し処理にも使用可能で、例えば
1
2
3
|
for i in 'a'..'d'
p i
end
|
を実行することで
1
2
3
4
|
"a"
"b"
"c"
"d"
|
という結果が得られます。
Rubyの範囲オブジェクトの使い方
ここからはRubyの範囲オブジェクトの具体的な使い方を紹介します。範囲オブジェクトの作成や範囲オブジェクトの繰り返し処理、範囲オブジェクトの要素数、範囲オブジェクトの比較について説明します。
コード例も載せているので、自分で実際に書いてみて学んでいきましょう。
範囲オブジェクトの作成(..)
Rubyの範囲オブジェクトは「first..last」で作成できます。firstは範囲開始値、lastは範囲終了値で、firstからlastまでの値の範囲を表します。また、firstとlastは大小の比較ができるものでなければなりません。そのため、数値・文字・日付の範囲などを扱えます。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
|
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
|
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の範囲オブジェクトは「..」または「…」で作成できます。
範囲オブジェクトの作成(new)
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
|
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
|
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
|
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)
範囲オブジェクトの要素数は、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
|
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
|
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?で比較できます。
数値・文字・日付のどれにでも適用可能
Rubyのinclude?メソッドは数値、文字、日付のどのRangeオブジェクトでも適用可能です。
例えば、数値のRangeオブジェクトにinclude?メソッドを利用した場合、
1
2
3
|
range = 10..50
p range.include? 30
p range.include? 80
|
こちらの実行結果は
1
2
|
true
false
|
となります。また、日付のRangeオブジェクトにinclude?メソッドを利用した場合のコード例は、
1
2
3
4
|
require 'date'
p (Date.parse("2021-04-01")..Date.parse("2021-06-01")).include? Date.parse("2021-05-01")
p (Date.parse("2021-04-01")..Date.parse("2021-06-01")).include? Date.parse("2020-05-01")
|
で、実行すると
1
2
|
true
false
|
という結果で出力されます。
範囲オブジェクトの比較(===)
範囲オブジェクトに要素が含まれているか否か、「===」でも比較できます。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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の範囲オブジェクトで覚えておくと便利なもの2選
Rubyの範囲オブジェクトで覚えておくと便利なものが2つあります。日付の作成方法とsuccメソッドについて紹介します。
具体的なコードも紹介しているので、ぜひ自分で書いて学んでみてください。
1:日付の作成方法
Rubyの範囲オブジェクトを扱うことで、連番の日付が生成できます。
例えば2021-06-01から2021-06-10まで生成したい場合、
1
2
3
4
|
require 'date'
(Date.parse("2021-06-01")..Date.parse("2021-06-10")).each do |date|
p date
end
|
で実行結果が
1
2
3
4
5
6
7
8
9
10
|
<Date: 2021-06-01 ((2457814j,0s,0n),+0s,2299161j)>
<Date: 2021-06-02 ((2457815j,0s,0n),+0s,2299161j)>
<Date: 2021-06-03 ((2457816j,0s,0n),+0s,2299161j)>
<Date: 2021-06-04 ((2457817j,0s,0n),+0s,2299161j)>
<Date: 2021-06-05 ((2457818j,0s,0n),+0s,2299161j)>
<Date: 2021-06-06 ((2457814j,0s,0n),+0s,2299161j)>
<Date: 2021-06-07 ((2457815j,0s,0n),+0s,2299161j)>
<Date: 2021-06-08 ((2457816j,0s,0n),+0s,2299161j)>
<Date: 2021-06-09 ((2457817j,0s,0n),+0s,2299161j)>
<Date: 2021-06-10 ((2457818j,0s,0n),+0s,2299161j)>
|
となります。
2:succメソッド
Rubyで使用できるsuccメソッドは、指定した整数や文字列の次に当たる整数や文字列を返すメソッドです。
例えば、”a”..”g”というRubyの範囲オブジェクトを作成している状態で
1
|
"e".succ
|
を実行すると
1
|
"f"
|
という出力結果が得られます。
- システム
エンジニア - 範囲オブジェクトで指定すれば、日付を数字の順に並べることも可能になるのですね。
- プロジェクト
マネージャー - 範囲オブジェクトの繰り返しを処理など、ソースコードを参考にして活用しましょう。
Rubyの範囲オブジェクトを理解しよう
Rubyの範囲オブジェクト(Rangeオブジェクト)は、範囲を表すためのオブジェクトで、その作成方法や扱い方について説明しましたが、いかがでしたでしょうか。
作成した範囲オブジェクトに対して、繰り返し処理や検索処理ができます。ぜひご自身でソースコードを書いて、Rubyについて理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
Ruby新着案件New Job
-
RedmineプラグインおよびWEB開発/Ruby/東京都中央区/【WEB面談可】/在宅勤務
月給65万~65万円東京都中央区(新富町駅) -
Webアプリケーション運用保守/Ruby/東京都江東区/【WEB面談可】
月給50万~60万円東京都江東区(亀戸駅) -
Webアプリケーション開発(既存機能改修)のテスター/Ruby/東京都江東区/【WEB面談可】
月給25万~35万円東京都江東区(亀戸駅) -
Webアプリケーション開発(既存機能改修)/Ruby/東京都江東区/【WEB面談可】
月給45万~60万円東京都江東区(亀戸駅) -
Ansibelの自動構築/Ruby/東京都台東区/【WEB面談可】/テレワーク
月給46万~48万円東京都台東区(浅草駅) -
会計ワークフローの開発/Ruby/東京都新宿区/【WEB面談可】/フルリモート
月給46万~48万円東京都新宿区(新宿駅)