基礎RubyにおけるInclude,Extend,Load,Requireの使用の違い
2013 ワード
原文リンク:Ruby Require VS Load VS Include VS Extend
Include
次の例では、モジュールをクラスに挿入する場合、モジュールで定義されたメソッドをクラスに挿入することに相当します.mixinを使用できます.重複を避けるためにDRYのコードに使用されます.たとえば、複数のクラスがある場合、同じ関数が必要な場合はmoduleに関数を定義してincludeを行うことができます.以下の例では、モジュールLogとクラスTestClassが同一であると仮定する.rbファイル.複数のファイルが存在する場合は、loadまたはrequireを使用してファイルをインポートする必要があります.
Extend
Extendを使用してIncludeを置き換えると、インスタンスメソッドではなくクラスメソッドとしてモジュールにメソッドが追加されます.詳しくは例を見てください.
クラスでIncludeの代わりにExtendを使用すると、TestClassをインスタンス化してclassを呼び出すとtypeメソッドの場合、NoMethodErrorが得られます.もう一度強調しますが、Extendを使用する場合のメソッドはクラスメソッドです.
Require
Requireメソッドでは、ライブラリをロードでき、複数回ロードできません.requireを使用して同じlibraryを繰り返しロードすると、requireメソッドはfalseを返します.requireメソッドは、ロードするライブラリが異なるファイルにある場合に使用できます.次の例では、requireの使用方法を示します.
ファイルtest_library.rbとtest_require.rbは同じディレクトリの下にあります.
Load
Loadメソッドは基本的にrequireメソッドと機能が一致しますが、インポートするライブラリがロードされたかどうかは追跡されません.したがってloadメソッドを繰り返し使用すると、複数回ロードされます.ほとんどの場合、loadの代わりにrequireを使用します.しかし、モジュールのステータスが頻繁に変化するなど、ロードするたびにloadを使用する必要があります.loadを使用してロードし、最新のステータスを取得します.
Include
次の例では、モジュールをクラスに挿入する場合、モジュールで定義されたメソッドをクラスに挿入することに相当します.mixinを使用できます.重複を避けるためにDRYのコードに使用されます.たとえば、複数のクラスがある場合、同じ関数が必要な場合はmoduleに関数を定義してincludeを行うことができます.以下の例では、モジュールLogとクラスTestClassが同一であると仮定する.rbファイル.複数のファイルが存在する場合は、loadまたはrequireを使用してファイルをインポートする必要があります.
module Log
def class_type
"This class is of type: #{self.class}"
end
end
class TestClass
include Log
end
tc = TestClass.new.class_type
puts tc #This class is of type: TestClass
Extend
Extendを使用してIncludeを置き換えると、インスタンスメソッドではなくクラスメソッドとしてモジュールにメソッドが追加されます.詳しくは例を見てください.
module Log
def class_type
"This class is of type: #{self.class}"
end
end
class TestClass
extend Log
# ...
end
tc = TestClass.class_type
puts tc # This class is of type: TestClass
クラスでIncludeの代わりにExtendを使用すると、TestClassをインスタンス化してclassを呼び出すとtypeメソッドの場合、NoMethodErrorが得られます.もう一度強調しますが、Extendを使用する場合のメソッドはクラスメソッドです.
Require
Requireメソッドでは、ライブラリをロードでき、複数回ロードできません.requireを使用して同じlibraryを繰り返しロードすると、requireメソッドはfalseを返します.requireメソッドは、ロードするライブラリが異なるファイルにある場合に使用できます.次の例では、requireの使用方法を示します.
ファイルtest_library.rbとtest_require.rbは同じディレクトリの下にあります.
# test_library.rb
puts " load this libary "
# test_require.rb
puts (require './test_library')
puts (require './test_library')
puts (require './test_library')
#
# load this libary
# true
# false
# false
Load
Loadメソッドは基本的にrequireメソッドと機能が一致しますが、インポートするライブラリがロードされたかどうかは追跡されません.したがってloadメソッドを繰り返し使用すると、複数回ロードされます.ほとんどの場合、loadの代わりにrequireを使用します.しかし、モジュールのステータスが頻繁に変化するなど、ロードするたびにloadを使用する必要があります.loadを使用してロードし、最新のステータスを取得します.
puts load "./test_library.rb" # .rb, require
puts load "./test_library.rb"
puts load "./test_library.rb"
#
# load this libary
#true
# load this libary
#true
# load this libary
#true