レンジは値の間隔を表します — (1..10)は数値、('a'..'z')は文字など。レンジはメソッドを備えたオブジェクトで、イテレーション、スライシング、メンバーシップテスト、caseマッチングに使われます。Rubyの簡潔で表現力豊かな機能です。
レンジの作成 (.. vs ...)
(..)
(...)
(..)
重要な違い:..は終了を含む、...は終了を含まない(3つ目のドットが終了を「押しのけ」ます)。覚えておくべき重要なポイントです。
(1..5).each { |n| puts n } # iterate — 1 to 5
(1..5).to_a # [1, 2, 3, 4, 5] — convert to an array
(1..10).map { |n| n * 2 } # ranges support Enumerable methods
(1..100).sum # 5050
(1..10).select(&:even?) # [2, 4, 6, 8, 10]
レンジはEnumerableに含まれるため、each、map、selectなどに対応しており、to_aを使ってそれらを配列に具体化できます。
(1..100).include?(50) # true
(1..100).cover?(50) # true — faster (doesn't iterate, just checks endpoints)
age = 25
(18..65).include?(age) # check if a value falls in a range
include?/cover?はメンバーシップを効率的にテストします(特にcover?は、反復せずにエンドポイントだけをチェックします)。
# case/when with ranges — clean range-based branching
grade = case score
when 90..100 then "A"
when 80..89 then "B"
when 0..79 then "F"
end
# array/string slicing with ranges
[10, 20, 30, 40, 50][1..3] # [20, 30, 40] — slice by range
"hello world"[0..4] # "hello" — substring by range
# endless/beginless ranges (Ruby 2.6+)
arr[2..] # from index 2 to the end
(1..) # 1 to infinity (with lazy evaluation)
レンジは有用で表現力豊かなRubyの機能で、多くの一般的なシナリオで使われるため、それを理解することは価値のある日常的な知識です。
レンジは間隔(数値、アルファベット)を簡潔に表現し、いくつかの頻繁なコンテキストに現れます:イテレーション((1..5).each — シーケンスをループする清潔な方法)、スライシング配列と文字列(arr[1..3]、str[0..4] — サブシーケンスを優雅に抽出)、メンバーシップテスト(include?/cover? — 値が間隔に入るかチェック、cover?はエンドポイントをチェックするだけで効率的)、特に**case/whenマッチング**(レンジベースの分岐が清潔で、スコア範囲による成績評価のような一般的で読みやすいパターン)。
重要な**..(包括的)vs ...(排他的)**の区別を理解することは、レンジを正しく使うために必要です(また、混乱しやすいポイントです)。
レンジがEnumerableに含まれ(つまりmap/select/などに対応し)、イテレーション、スライシング、メンバーシップ、caseマッチングに使う方法、そして最新機能(終わりなし/始まりなしレンジ)を知ることは、実用的な用途をカバーします。
レンジはイディオマティックなRuby(イテレーション、スライシング、レンジベースの条件分岐、値範囲の検証)に頻繁に現れ、また間隔を扱うための簡潔で表現力豊かな方法であるため、レンジを理解すること — その構文(包括的vs排他的)、メソッド、一般的な用途(イテレーション、スライシング、メンバーシップ、caseマッチング)— は、シーケンスと間隔を優雅に扱う清潔でイディオマティックなRubyを書くための実用的で関連性のある知識です。