HOWTO · Ruby

Ruby で拡張する

このチュートリアルでは、Ruby のインクルードとエクステンドについて説明します。

このページの内容

クラスからクラス、関数から関数への参照は、オブジェクト指向プログラミングの一般的なタスクです。 異なるクラスからモジュールをインポートする方法を探している場合は、この記事が役に立ちます。

Ruby では、これを 2つの異なる方法で行うことができます。 include または extend のいずれかを使用します。

この記事では、Ruby の includeextend について説明し、トピックを簡単にするために関連する例を見ていきます。

Ruby のincludeとは

includeを使用すると、コード モジュールをインポートできます。 クラスを介してモジュールを直接インポートする方法を取得しようとすると、スーパークラスのサブクラスとしてインポートされるため、エラーが発生します。

ここでの解決策は、クラスのインスタンスによって取得することです。 キーワード include を使用して、include を使用できます。

Ruby の extend とは

モジュールをインポートする別の方法は、キーワード extend を使用することです。 extend を使用して、メソッドをクラス メソッドとしてインポートできます。

ただし、インスタンスを介してインポートされたモジュールのメソッドを取得しようとすると、エラーが発生します。 このエラーを回避するには、クラス定義でそのメソッドを取得する必要があります。

Ruby で includeextend を使用する

以下の例では、Ruby での include および extend キーワードの使用について説明します。 以下のサンプルコードを見てください。

module MyModule
  def MyMethod
    puts 'DelftStack is nice.'
  end
end

class ClassA

  # only can access MyModule methods
  # By the instance.
  include MyModule
end

class ClassB

  # only can access MyModule methods
  # By the class definition.
  extend MyModule
end

# Access from the object
ClassA.new.MyMethod

# Acess from class
ClassB.MyMethod

各行の目的はコメントアウトされ、キーワード include および extend の動作メカニズムについて説明されています。 上記のコード例を実行すると、以下の出力が得られます。

DelftStack is nice.
DelftStack is nice.

ここで、以下のようにクラスから直接メソッドにアクセスしようとすると:

ClassA.MyMethod

以下のエラーが表示されます。

# NoMethodError: undefined  method
# `MyMethod' for ClassA:Class

これは、ClassA がキーワード include を使用してモジュールをインクルードし、include ではクラスから直接メソッドを呼び出すことができないためです。