Rubyの範囲(Range)の使い方を完全ガイド!初心者でもわかる1..10や'a'..'z'とeachの活用法
生徒
「Rubyで1から10までの数字を一気に扱いたいときってどうすればいいんですか?」
先生
「その場合は範囲(Range)を使うと便利です。例えば1..10と書けば1から10までの数字をまとめて表せますよ。」
生徒
「へえ!じゃあアルファベットのaからzもできるんですか?」
先生
「もちろんです。文字でも範囲を作れるので、'a'..'z'と書けばアルファベットの小文字全部を表現できます。」
1. Rubyの範囲(Range)とは?
Rubyの範囲(Range)は、ある値から別の値までを連続したデータとして表現できるデータ型です。数値だけでなく文字や日付でも使えます。プログラミングで「連番を作りたい」「決まった範囲を扱いたい」ときにとても便利です。
例えば、1から10までの数を表すには次のように書きます。
range = 1..10
puts range.to_a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
to_aは範囲を配列(Array)に変換するメソッドです。こうすれば中身を確認できます。
2. 範囲の記号「..」と「...」の違い
範囲を表すときには..(2つドット)と...(3つドット)の2種類があります。
- 2つのドット(..) → 終わりの値を含む
- 3つのドット(...) → 終わりの値を含まない
puts (1..5).to_a
puts (1...5).to_a
[1, 2, 3, 4, 5]
[1, 2, 3, 4]
このように使い分けることで、必要に応じて柔軟に範囲を指定できます。
3. 文字の範囲を使う
範囲は数値だけではなく文字にも使えます。例えばアルファベットを一気に取り出せます。
letters = 'a'..'f'
puts letters.to_a
["a", "b", "c", "d", "e", "f"]
このようにして文字をまとめて扱えば、辞書順の処理やID生成などにも応用できます。
4. eachで範囲をループ処理する
eachメソッドを使えば範囲内の要素を1つずつ取り出して処理できます。for文の代わりに使うことが多いです。
(1..5).each do |n|
puts "番号: #{n}"
end
番号: 1
番号: 2
番号: 3
番号: 4
番号: 5
数値だけでなく、文字でも同じようにループできます。
('x'..'z').each do |ch|
puts "文字: #{ch}"
end
文字: x
文字: y
文字: z
5. 範囲を使った実用的な例
範囲は日常的な処理でも役立ちます。例えば、点数に応じて成績をつけるプログラムを書いてみましょう。
score = 82
case score
when 90..100
grade = "A"
when 70..89
grade = "B"
when 50..69
grade = "C"
else
grade = "D"
end
puts "成績: #{grade}"
成績: B
このようにcase文と組み合わせれば、範囲を条件分岐に使えて便利です。
6. 範囲オブジェクトの活用テクニック
範囲はただの表記だけでなくRangeオブジェクトとして扱えます。便利なメソッドも用意されています。
include?→ 値が範囲に含まれるか確認first/last→ 最初や最後の値を取得step→ ステップ幅を指定して繰り返す
range = 1..10
puts range.include?(5) # true
puts range.first # 1
puts range.last # 10
(1..10).step(2) do |n|
puts n
end
true
1
10
1
3
5
7
9
このようにRangeをうまく使うことで、Rubyのコードをシンプルに書けるようになります。
まとめ
Rubyの範囲(Range)は、ひとつひとつの値を手作業で並べなくても、連続した数値や文字の集まりを直感的に表現できるとても強力なしくみです。この記事の前半では、1..10や1...10といった基本的な書きかたから、'a'..'z'のような文字の範囲まで、Rubyならではのシンプルでわかりやすい記述方法を学びました。ふりかえってみると、数値の範囲を使えば、連番を扱う配列をひとつずつ書かなくてもよくなり、文字の範囲を使えば、アルファベットや識別用のラベルをまとめて用意することができるようになります。範囲をそのままto_aで配列に変換したり、eachで順番に処理したりできる点は、Rubyのコードを簡潔にしながらも、やりたい処理をきちんと実現できる便利なポイントです。
また、範囲には..と...という二種類のドット記号があり、それぞれ「終わりをふくむ範囲」と「終わりをふくまない範囲」という違いを持ちます。ふだんのプログラムでは、テストの点数やページ番号など、終点をふくめたい場面では1..10のような表現をつかい、ループで「指定した値のひとつ手前までにしたい」といったケースでは1...10をつかうと自然です。このように、使い分けを意識することで、意図したとおりの範囲を分かりやすく表現できるようになり、オフバイワンのミスも減らせます。プログラムの読み手にとっても、ドットの数を見れば範囲をどこまで扱っているのかをすぐに読み取れるため、見通しのよいコードを書くための重要な要素となります。
Rubyの範囲は、Rangeオブジェクトとしてさまざまなメソッドを利用できる点も大きな特徴です。たとえば、include?メソッドをつかえば、特定の値が範囲にふくまれているかどうかを簡単に確認できますし、firstやlastを使えば、最初と最後の値をすぐに取り出すことができます。さらに、stepメソッドを使うことで、「二つおき」「三つおき」といった具合に、ステップ幅を決めて範囲を進めていく処理を書くこともできます。これらのメソッドを組み合わせて使うことで、添字を自分で増やしたり条件を細かく書いたりしなくても、きれいで伝わりやすいコードにまとめることができます。
記事のなかでは、範囲をつかったeachによるループ処理もていねいに見てきました。(1..5).each do |n| ... endのような書き方は、Rubyらしい読みやすさをそのまま活かしたループの書き方です。数値の範囲でも文字の範囲でも同じように扱えるため、「回数を決めて繰り返したい」「連続したラベルを画面に出したい」といった処理を、短いコードで表現できます。とくに、('a'..'z').eachのようにアルファベットをくりかえし処理するパターンは、ファイル名を自動生成したり、インデックスとして使ったりするケースでも役に立ちます。
さらに、範囲は条件分岐と組み合わせても非常に便利です。記事中の成績判定の例のように、case文のwhen 90..100やwhen 70..89といった書き方を使えば、「何点から何点まではこの評価」といったルールを、見やすく直感的なコードに落とし込むことができます。複雑なifと&&や||を組み合わせるよりも、範囲を利用したcase文のほうが意図が伝わりやすく、あとから見直したときにもすぐに条件を理解できます。このように、Rubyの範囲はループ処理だけでなく、条件分岐の場面でもコードの読みやすさを支える重要な存在です。
日付や時間など、数値以外の連続データに対して範囲を使うこともできます。たとえば、ある日付から別の日付までの期間を表現したり、特定の曜日だけを取り出したりするような処理でもRangeを使った書き方が役に立ちます。今回の記事では主に数値と文字を中心に扱いましたが、発想を広げれば、日付のライブラリと組み合わせて「ある期間にふくまれる日付をひとつずつ処理する」といった実用的な使いかたも可能になります。Rubyの範囲を自在に扱えるようになれば、単純なループの枠をこえて、アプリケーション全体でつかえる表現力の高い道具としてRangeを活用できるようになるでしょう。
全体をとおして振り返ると、Rubyの範囲は、コードの行数を減らすだけでなく、処理の意図を読みやすく伝えるための大切な要素だということが分かります。連番を作る、配列に変換する、eachで回す、stepで間隔を広げる、caseと組み合わせて区間ごとの処理を書く、といった一連の流れを理解すれば、これからさまざまなプログラムを作るときに、自然と「ここはRangeを使おう」という発想が生まれるはずです。たくさんのコード例にふれながら、自分の手で実行してみることで、Rangeの便利さとRubyの表現力の高さを、より深く体験していきましょう。
実践的なサンプルプログラムで範囲を復習しよう
ここでは、記事の内容をふりかえりながら、Rubyの範囲をいくつかのパターンで使ったサンプルコードをまとめて紹介します。数値のRange、文字のRange、eachによるループ処理、stepを使ったスキップつきのくり返し、case文による条件分岐などをまとめて確認できるようになっています。
# 数値の範囲を配列に変換して確認
numbers = (1..10).to_a
puts "数値の範囲: #{numbers.inspect}"
# 文字の範囲を配列に変換
letters = ('a'..'f').to_a
puts "文字の範囲: #{letters.inspect}"
# eachで範囲をループして表示
(1..5).each do |n|
puts "番号: #{n}"
end
# ステップ幅を指定して範囲を処理
(1..12).step(3) do |value|
puts "ステップ処理の値: #{value}"
end
# 範囲を使った成績判定
score = 78
grade =
case score
when 90..100
"A"
when 70..89
"B"
when 50..69
"C"
else
"D"
end
puts "点数: #{score} 点"
puts "成績: #{grade}"
# include?で値が範囲にふくまれているか確認
range = 1..10
puts "5は範囲にふくまれる? => #{range.include?(5)}"
puts "20は範囲にふくまれる? => #{range.include?(20)}"
このサンプルプログラムを実際にていこうしてみると、Rangeオブジェクトがどのように配列へ変換され、eachでどのようにループされ、stepでどれだけスマートに間隔つきのくり返しが書けるのかを体感することができます。さらに、case文と組み合わせた成績判定の例では、範囲を使うことで条件の区切りがはっきりと見え、何点から何点までがどの評価に対応しているのかがひと目でわかります。include?で値が範囲にふくまれているかどうかを確認する処理もあわせて覚えておくと、入力チェックや条件分岐の前処理など、多くの場面で活用することができるでしょう。
生徒
「先生、きょうの勉強でRubyの範囲がかなり身近なものに感じられるようになりました。いままではただ1..10という書き方をなんとなく見ていただけでしたが、Rangeオブジェクトとしていろいろなメソッドが使えることが分かっておどろきました。」
先生
「その実感はとても大事ですね。単なる記号に見えるかもしれませんが、Rubyの範囲は配列にも変換できますし、eachやstepとも組み合わせやすいので、実際のプログラムのなかでは頻繁に使われる便利な道具なんですよ。」
生徒
「とくに、1..5と1...5の違いがはっきりしたのがよかったです。終わりの値をふくむかどうかでちゃんと意味が変わるので、これからはドットの数をよく確認して書くようにしようと思います。」
先生
「そこに気をつけられるようになれば、範囲を使ったループや条件分岐でのミスはかなり減りますよ。終点をふくむかどうかを意識しながら書くことで、テストの点数やレベル分けなどの処理もずっと分かりやすく組み立てられるようになります。」
生徒
「それから、('a'..'z').eachみたいに文字の範囲をつかえるのも面白かったです。何かのラベルを順番につくったり、メニューのキーに使ったり、いろいろなアイデアが浮かんできました。」
先生
「文字のRangeは、ちょっとした工夫でとても便利な道具になりますよ。アルファベットをひとつずつ処理したり、識別子として活用したり、工夫しだいでさまざまな使い方ができます。これから自分のプログラムのなかでも試してみてください。」
生徒
「はい、さっそく今日のサンプルコードをまねしながら、Rangeとeachとstepを組み合わせた処理を自分でも書いてみます。Rubyの範囲を使いこなせるようになれば、ループと条件分岐がもっと楽しくなりそうです。」
先生
「とてもよい心構えですね。自分の手で何度も書いて、動かして、少しずつ応用していくことで、Rangeの使いみちが自然と身についていきます。今日学んだことを土台にして、これからもRubyでいろいろなプログラムづくりに挑戦していきましょう。」