webエンジニアの日常

RubyやPython, JSなど、IT関連の記事を書いています

Rubyの3つドットで指定する範囲([1...4]等)はいつ使うか

こんにちは、エンジニアのさもです。

普段Rubyを使っている方や、Rubyを使い始めた方もuser_list[0..3]のように配列に対して範囲を指定できることはご存知かと思います。

一方、user_list[0...3]のように3つドットを使うとindexが0から2(3は含まない)の範囲の要素をとってくることができます。

これ、いつ使うねんとずっと思っていたのですが、使うと記述が簡単になる場面に遭遇したので紹介します。

スポンサーリンク

はじめに

まず2つドットと3つドットの違いを確認しておきます。

array = ["a", "b", "c", "d", "e", "f"]
array[2..4] #=> ["c", "d", "e"]
array[2...4] #=> ["c", "d"]

2つドットのときはindexが2から4の要素を取得しています。

3つドットのときはindexが2から3の要素を取得しています。

見つけた使いどころ

与えられた配列を2分割にするメソッドを書いているときに見つけました。

要件は、与えられた配列を2分割にする。要素数が奇数の場合は、最初の配列が1つ要素が多いようにする。

  • 2つドットを使う場合
def array_split(array)
  half_size = (array.size / 2.0).round
  first_array = array[0..half_size - 1]
  second_array = array[half_size..array.size - 1]
  [first_array, second_array]
end
  • 3つドットを使う場合
def array_split(array)
  half_size = (array.size / 2.0).round
  first_array = array[0...half_size]
  second_array = array[half_size...array.size]
  [first_array, second_array]
end

お分かりでしょうか?ほんの少しの違いですが、half_size - 1array.size - 1が-1を付けない簡潔な形になっています。

プログラミングではあるあるですが、配列の最後の要素を直接indexで指定する場合、配列サイズより1つ小さい値で指定しますよね。

3つドットを使うことでこのわずらわしさがなくなりました!

3つドットの実装はこれを意図したかどうかは分かりませんが、綺麗に書けたのでうれしかったです。

読者登録をしていただけると、ブログを続ける励みになりますので、よろしくお願いします。