🌊
【Ruby】 特異メソッドとは選ばれし者に与えられた「力」であった
特異メソッドとは?
通常、クラス内に定義したメソッドはそのクラスのインスタンスであれば使うことができます。
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