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

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

ima1zumi
August 22, 2020
760

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

ima1zumi

August 22, 2020
Tweet

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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


    6

    View full-size slide

  7. むずかしい
    7

    View full-size slide

  8. 特異メソッド
    8

    View full-size slide

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


    9

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. クラスメソッド
    12

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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


    17

    View full-size slide

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

    View full-size slide

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

    19

    View full-size slide

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

    View full-size slide