HOWTO · Ruby
Ruby で拡張する
このチュートリアルでは、Ruby のインクルードとエクステンドについて説明します。
このページの内容
クラスからクラス、関数から関数への参照は、オブジェクト指向プログラミングの一般的なタスクです。 異なるクラスからモジュールをインポートする方法を探している場合は、この記事が役に立ちます。
Ruby では、これを 2つの異なる方法で行うことができます。 include または extend のいずれかを使用します。
この記事では、Ruby の include と extend について説明し、トピックを簡単にするために関連する例を見ていきます。
Ruby のincludeとは
includeを使用すると、コード モジュールをインポートできます。 クラスを介してモジュールを直接インポートする方法を取得しようとすると、スーパークラスのサブクラスとしてインポートされるため、エラーが発生します。
ここでの解決策は、クラスのインスタンスによって取得することです。 キーワード include を使用して、include を使用できます。
Ruby の extend とは
モジュールをインポートする別の方法は、キーワード extend を使用することです。 extend を使用して、メソッドをクラス メソッドとしてインポートできます。
ただし、インスタンスを介してインポートされたモジュールのメソッドを取得しようとすると、エラーが発生します。 このエラーを回避するには、クラス定義でそのメソッドを取得する必要があります。
Ruby で include と extend を使用する
以下の例では、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 ではクラスから直接メソッドを呼び出すことができないためです。