クラスメソッドとは何なのか2020-08-22@ima1zumi1
View Slide
⾃⼰紹介@ima1zumiJavaScriptのプラクティス2
きっかけMyModule の外から my_method を呼びたいMyModule.my_method の形では呼べないmodule MyModuledef my_method"my_method!"endendp MyModule.my_method# => NoMethodError3
my_method をクラスメソッドにしたら呼べるmodule MyModuledef self.my_method #クラスメソッドにする"my_method!"endendp MyModule.my_method# => my_method!4
Moduleのクラスメソッド…???Module と Class は別物のはず…クラスメソッドってなんなんだ…?クラスメソッドについて調べてみよう5
クラスメソッドとはクラス/メソッドの定義 (Ruby 2.7.0 リファレンスマニュアル)Ruby におけるクラスメソッドとはクラスの特異メソッドのことです。Ruby では、クラスもオブジェクトなので、普通のオブジェクトと同様に特異メソッドを定義できます。““6
むずかしい7
特異メソッド8
特異メソッド特異メソッドとは?特定のオブジェクトだけで使えるメソッドRubyにおけるクラスメソッドとはクラスの特異メソッドのこと““9
特異メソッドを定義するオブジェクト.メソッド名 の形で定義するclass MyClassendobj1 = MyClass.newdef obj1.my_method # obj1だけ使えるメソッドを定義"特異メソッドだよ"endp obj1.my_method# => "特異メソッドだよ"10
特異メソッドは他のオブジェクトから利⽤できないobj2 = MyClass.newp obj2.my_method# => NoMethodError11
クラスメソッド12
クラスメソッドを定義するself.メソッド名 の形で定義するclass MyClassdef self.my_class_method"クラスメソッドだよ"endendp MyClass.my_class_method# => "クラスメソッドだよ"13
クラスオブジェクトの話Ruby ではほとんど全てがオブジェクトクラスもオブジェクトMyClass クラスは Class クラスのオブジェクトMyClass.class# => ClassMyClass.object_id# => 22014
クラスメソッドは特異メソッドの⼀種特異メソッドは特定のオブジェクトに定義するメソッドクラスメソッドはクラスオブジェクトに定義する特異メソッドclass MyClassendobj = MyClass.newdef obj.my_method; end # objに特異メソッドを定義def MyClass.my_class_method; end # MyClassにクラスメソッドを定義15
クラスメソッドを定義する(再)class MyClassdef self.my_class_method_1 #ここでは self = MyClass"クラスメソッドだよ"endenddef MyClass.my_class_method_2"これもクラスメソッドだよ"endp MyClass.my_class_method_1# =>クラスメソッドだよp MyClass.my_class_method_2# =>これもクラスメソッドだよ16
クラスメソッドとは(再)クラス/メソッドの定義 (Ruby 2.7.0 リファレンスマニュアル)Ruby におけるクラスメソッドとはクラスの特異メソッドのことです。Ruby では、クラスもオブジェクトなので、普通のオブジェクトと同様に特異メソッドを定義できます。““17
ModuleのクラスメソッドとはなんだったのかModuleオブジェクトに特異メソッドを定義することmodule MyModuledef self.my_method"my_method!"endendp MyModule.my_method# => my_method!18
まとめ特異メソッドとは、特定のオブジェクトに定義するメソッドRubyではクラスもオブジェクトクラスメソッドはクラスオブジェクトに定義した特異メソッドのこと19
参考メタプログラミング Rubyパーフェクト Rubyプロを⽬指す⼈のためのRuby⼊⾨るりまオブジェクト指向スクリプト⾔語 Ruby リファレンスマニュアル(Ruby 2.7.0 リファレンスマニュアル)20