🌊

【Ruby】 特異メソッドとは選ばれし者に与えられた「力」であった

2025/02/25に公開

特異メソッドとは?

通常、クラス内に定義したメソッドはそのクラスのインスタンスであれば使うことができます。

class Student
  def study
    puts "勉強中..."
  end
end

tanaka = Student.new
tanaka.study # 勉強中...

特異メソッドとは、「特定のオブジェクトだけが使うことのできるメソッド」です。
まるで集団の中で選ばれし者がでたようなイメージでしょうか。

class Student
  def study
    puts "勉強中..."
  end
end

tanaka = Student.new
murata = Student.new

def murata.the_time_stopper
  puts "村田は時をとめたーー"
end


tanaka.the_time_stopper # undefined method `the_time_stopper'
murata.the_time_stopper # "村田は時をとめたーー"

実はクラスメソッドも特異メソッドの一つらしい。
確かに「特定のオブジェクトだけが使うことのできるメソッド」に当てはまりますね。

class Test
  def self.hoge
    puts "hogeee!" # Testクラスのオブジェクトだけが使える
  end
end

でも実際どこで使う?

調べたところ、特定のオブジェクトに一時的な振る舞いをさせたい時に使うらしい。

special_orders = Order.where(prefecture: [Prefecture::OKINAWA, Prefecture::HOKKAIDO],
                             created_at: Date.new(2025, 1, 1).beginning_of_day..Date.new(2025, 1, 3).end_of_day)

def special_orders.calculate_newyears_shipping_fee
  self.each do |order|
    order.shipping_fee = 0
  end
  self
end

うーん、でもこれだったらbefore_saveとアーリーリターンつかった方が可読性は高いな。。
まだ今の自分にはココ!という使い所が想像できず。。

時間がある時や実務で見かけた時、理解度が上がった時に追記していこうと思います。

Discussion