1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

Rubyオブジェクト指向プログラミングにおけるクラスメソッドとクラスエクステンション

2022-01-04 16:09:51

クラスメソッド

クラスメソッドは、基本的にクラスのシングルピース・クラスに住むシングルピース・メソッドです。そのために定義された3つのメソッド、すなわち:

# method one
def MyClass.a_class_method; end


# Method 2
class MyClass
  def self.other_class_method; end
end


# Method 3*
class MyClass
  class << self
    def yet_another_class_method; end
  end
end



このうち3つ目は、クラスメソッドの本質を語っているので、特に覚えておいてください

クラスの拡張機能

クラスエクステンションは、クラスのシングルトン・クラスにモジュールを追加して、クラスメソッドを定義します。

module MyModule
  def my_method; 'hello'; end
end

class MyClass
  class < self
    include MyModule
  end
end

MyClass.my_method



上記のコードは、MyClass クラスのシングルトン クラスに MyModule モジュールを導入することで、具象クラス拡張がどのように実装されるかを示しています。なぜなら my_method メソッドは MyClass のシングルトン クラスのインスタンスメソッドであり、そのような my_method メソッドは MyClass のクラスメソッドでもあるのだからです。

オブジェクトの拡張機能

クラスメソッドは単一ピースメソッドの特殊なケースなので、クラス拡張の技術を任意のオブジェクトに適用することができ、これをオブジェクト拡張と呼びます

# Method 1: Open a single class to extend
module MyModule
  def my_method; 'hello'; end
end

obj = Object.new
class << obj
  include MyModule
end

obj.my_method # => "hello"
obj.singleton_methods # => [:my_method]
# Method 2: Object#extend method
module MyModule
  def my_method; 'hello'; end
end

obj = Object.new
# Object extensions
obj.extend MyModule
obj.my_method # => "hello" 
# class extension
class MyClass
  extend MyModule
end

MyClass.my_method # => "hello"



Object#extend は、受信者のシングルトン・クラスにモジュールをインクルードするための高速なキー・ウェイです。