Rubyのrange演算子には「..」(ドット2つ)と「...」(ドット3つ)の2種類があります。
これらは一見似ていますが、重要な違いがあります。この記事では、その違いと使い方について説明します。
基本的な違い
-
..
(ドット2つ): 終端を含む範囲を表す(inclusive) -
...
(ドット3つ): 終端を含まない範囲を表す(exclusive)
具体例で見る違い
# ドット2つの場合
(1..5).to_a # => [1, 2, 3, 4, 5]
# ドット3つの場合
(1...5).to_a # => [1, 2, 3, 4]
ご覧の通り、..
を使用した場合は終端の5が含まれていますが、...
を使用した場合は5が含まれていません。
数値以外での使用例
文字列の範囲でも同様の違いが見られます:
('a'..'c').to_a # => ["a", "b", "c"]
('a'...'c').to_a # => ["a", "b"]
実用的な使用例
配列のスライシングなどで、この違いが活きてきます:
arr = [0, 1, 2, 3, 4, 5]
# インデックス1から3まで(4は含まない)
arr[1...4] # => [1, 2, 3]
# インデックス1から4まで(4を含む)
arr[1..4] # => [1, 2, 3, 4]
注意点
- 数値の範囲で
...
を使用する場合、終端の値は含まれないことに注意しましょう。 - 文字列や日付など、連続的でないオブジェクトの範囲を扱う際は、
succ
メソッドの挙動に注意が必要です。
まとめ
-
..
は終端を含む(inclusive) -
...
は終端を含まない(exclusive)
適切な範囲演算子を選択することで、より明確で効率的なコードを書くことができます。
状況に応じて使い分けることが重要です。
以上が、RubyのRange演算子「..」と「...」の違いについての基本的な説明です。
この違いを理解することで、より柔軟にRangeを活用できるようになるでしょう。