Slide 1

Slide 1 text

クラスメソッドとは何なのか 2020-08-22 @ima1zumi 1

Slide 2

Slide 2 text

⾃⼰紹介 @ima1zumi JavaScriptのプラクティス 2

Slide 3

Slide 3 text

きっかけ MyModule の外から my_method を呼びたい MyModule.my_method の形では呼べない module MyModule def my_method "my_method!" end end p MyModule.my_method # => NoMethodError 3

Slide 4

Slide 4 text

my_method をクラスメソッドにしたら呼べる module MyModule def self.my_method # クラスメソッドにする "my_method!" end end p MyModule.my_method # => my_method! 4

Slide 5

Slide 5 text

Moduleのクラスメソッド…??? Module と Class は別物のはず… クラスメソッドってなんなんだ…? クラスメソッドについて調べてみよう 5

Slide 6

Slide 6 text

クラスメソッドとは クラス/メソッドの定義 (Ruby 2.7.0 リファレンスマニュアル) Ruby におけるクラスメソッドとはクラスの特異メソッドのこと です。Ruby では、クラスもオブジェクトなので、普通のオブジ ェクトと同様に特異メソッドを定義できます。 “ “ 6

Slide 7

Slide 7 text

むずかしい 7

Slide 8

Slide 8 text

特異メソッド 8

Slide 9

Slide 9 text

特異メソッド 特異メソッドとは? 特定のオブジェクトだけで使えるメソッド Rubyにおけるクラスメソッドとはクラスの特異メソッドのこと “ “ 9

Slide 10

Slide 10 text

特異メソッドを定義する オブジェクト.メソッド名 の形で定義する class MyClass end obj1 = MyClass.new def obj1.my_method # obj1 だけ使えるメソッドを定義 " 特異メソッドだよ" end p obj1.my_method # => " 特異メソッドだよ" 10

Slide 11

Slide 11 text

特異メソッドは他のオブジェクトから利⽤できない obj2 = MyClass.new p obj2.my_method # => NoMethodError 11

Slide 12

Slide 12 text

クラスメソッド 12

Slide 13

Slide 13 text

クラスメソッドを定義する self.メソッド名 の形で定義する class MyClass def self.my_class_method " クラスメソッドだよ" end end p MyClass.my_class_method # => " クラスメソッドだよ" 13

Slide 14

Slide 14 text

クラスオブジェクトの話 Ruby ではほとんど全てがオブジェクト クラスもオブジェクト MyClass クラスは Class クラスのオブジェクト MyClass.class # => Class MyClass.object_id # => 220 14

Slide 15

Slide 15 text

クラスメソッドは特異メソッドの⼀種 特異メソッドは特定のオブジェクトに定義するメソッド クラスメソッドはクラスオブジェクトに定義する特異メソッド class MyClass end obj = MyClass.new def obj.my_method; end # obj に特異メソッドを定義 def MyClass.my_class_method; end # MyClass にクラスメソッドを定義 15

Slide 16

Slide 16 text

クラスメソッドを定義する(再) class MyClass def self.my_class_method_1 # ここでは self = MyClass " クラスメソッドだよ" end end def MyClass.my_class_method_2 " これもクラスメソッドだよ" end p MyClass.my_class_method_1 # => クラスメソッドだよ p MyClass.my_class_method_2 # => これもクラスメソッドだよ 16

Slide 17

Slide 17 text

クラスメソッドとは(再) クラス/メソッドの定義 (Ruby 2.7.0 リファレンスマニュアル) Ruby におけるクラスメソッドとはクラスの特異メソッドのこと です。Ruby では、クラスもオブジェクトなので、普通のオブジ ェクトと同様に特異メソッドを定義できます。 “ “ 17

Slide 18

Slide 18 text

Moduleのクラスメソッドとはなんだっ たのか Moduleオブジェクトに特異メソッドを定義すること module MyModule def self.my_method "my_method!" end end p MyModule.my_method # => my_method! 18

Slide 19

Slide 19 text

まとめ 特異メソッドとは、特定のオブジェクトに定義するメソッド Rubyではクラスもオブジェクト クラスメソッドはクラスオブジェクトに定義した特異メソッドのこ と 19

Slide 20

Slide 20 text

参考 メタプログラミング Ruby パーフェクト Ruby プロを⽬指す⼈のためのRuby⼊⾨ るりま オブジェクト指向スクリプト⾔語 Ruby リファレンスマニュアル (Ruby 2.7.0 リファレンスマニュアル) 20