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

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

ima1zumi
August 22, 2020
680

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

ima1zumi

August 22, 2020
Tweet

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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


    6

    View Slide

  7. むずかしい
    7

    View Slide

  8. 特異メソッド
    8

    View Slide

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


    9

    View Slide

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

    View Slide

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

    View Slide

  12. クラスメソッド
    12

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 Slide

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


    17

    View Slide

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

    View Slide

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

    19

    View Slide

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

    View Slide