Upgrade to Pro — share decks privately, control downloads, hide ads and more …

クラスメソッドとは何なのか / whats-class-method-20200822

74b5a82b8710accc1e6189a19f0b4935?s=47 ima1zumi
August 22, 2020
520

クラスメソッドとは何なのか / whats-class-method-20200822

74b5a82b8710accc1e6189a19f0b4935?s=128

ima1zumi

August 22, 2020
Tweet

Transcript

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

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

  3. きっかけ MyModule の外から my_method を呼びたい MyModule.my_method の形では呼べない module MyModule def

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

    end p MyModule.my_method # => my_method! 4
  5. Moduleのクラスメソッド…??? Module と Class は別物のはず… クラスメソッドってなんなんだ…? クラスメソッドについて調べてみよう 5

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

    “ “ 6
  7. むずかしい 7

  8. 特異メソッド 8

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

  10. 特異メソッドを定義する オブジェクト.メソッド名 の形で定義する class MyClass end obj1 = MyClass.new def

    obj1.my_method # obj1 だけ使えるメソッドを定義 " 特異メソッドだよ" end p obj1.my_method # => " 特異メソッドだよ" 10
  11. 特異メソッドは他のオブジェクトから利⽤できない obj2 = MyClass.new p obj2.my_method # => NoMethodError 11

  12. クラスメソッド 12

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

    end p MyClass.my_class_method # => " クラスメソッドだよ" 13
  14. クラスオブジェクトの話 Ruby ではほとんど全てがオブジェクト クラスもオブジェクト MyClass クラスは Class クラスのオブジェクト MyClass.class #

    => Class MyClass.object_id # => 220 14
  15. クラスメソッドは特異メソッドの⼀種 特異メソッドは特定のオブジェクトに定義するメソッド クラスメソッドはクラスオブジェクトに定義する特異メソッド class MyClass end obj = MyClass.new def

    obj.my_method; end # obj に特異メソッドを定義 def MyClass.my_class_method; end # MyClass にクラスメソッドを定義 15
  16. クラスメソッドを定義する(再) 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
  17. クラスメソッドとは(再) クラス/メソッドの定義 (Ruby 2.7.0 リファレンスマニュアル) Ruby におけるクラスメソッドとはクラスの特異メソッドのこと です。Ruby では、クラスもオブジェクトなので、普通のオブジ ェクトと同様に特異メソッドを定義できます。

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

    p MyModule.my_method # => my_method! 18
  19. まとめ 特異メソッドとは、特定のオブジェクトに定義するメソッド Rubyではクラスもオブジェクト クラスメソッドはクラスオブジェクトに定義した特異メソッドのこ と 19

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

    (Ruby 2.7.0 リファレンスマニュアル) 20