基礎RubyにおけるInclude,Extend,Load,Requireの使用の違い

2013 ワード

原文リンク:Ruby Require VS Load VS Include VS Extend
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