RubyのRangeオブジェクトを使って、数値が指定した範囲内にあるかを調べる

こんにちは!kossyです!




さて、今回はRubyでRangeオブジェクトを使って、ある数値がRangeオブジェクトの範囲内に含まれているかどうかを
チェックするやり方をブログに残してみたいと思います。






環境
Ruby 2.5.1






実装

先に実装を晒します。

# number は Pokemonクラスのカラム名です。

  def pokedex
    if (1..9) === number
      "00#{number}"
    elsif (11..99) === number
      "0#{number}"
    else
      number
    end
  end

irbで(1..9)の正体を調べます。

irb(main):001:0> (1..9)
=> 1..9
irb(main):002:0> (1..9).class
=> Range

どうやらRangeクラスのオブジェクトらしいです。
class Range (Ruby 2.6.0)

(0..9)でRangeクラスのオブジェクトを生成し、 === 演算子で numberが(0..9)の間に含まれているかをチェックしています。
チェックしたのち、numberの値が範囲(1..9)内であれば、numberの前に00を付与した文字列を返します。
numberの値が範囲(11..99)内であれば、numberの前に0を付与した文字列を返します。


ではコンソールで実行してみましょう。

[1] pry(main)> @pokemon = Pokemon.find 1
  Pokemon Load (0.7ms)  SELECT  `pokemons`.* FROM `pokemons` WHERE `pokemons`.`id` = 1 LIMIT 1
=> #<Pokemon:0x00007fae29fcc568
 id: 1,
 number: 1,
 name: "フシギダネ",
 type_1: "くさ",
 type_2: "どく",
 hp: 45,
 attack: 49,
 defense: 49,
 sp_attack: 65,
 sp_defense: 65,
 speed: 45,
 total: 318,
 created_at: Tue, 13 Aug 2019 13:02:29 UTC +00:00,
 updated_at: Tue, 13 Aug 2019 13:02:29 UTC +00:00>
[2] pry(main)> @pokemon.pokedex
=> "001"


期待通りの動作をしています。
ある数値が指定した範囲内にあるかを調べるにはRangeオブジェクトを用いれば良さそうです。