0
module MyModule
    def self.my_method
        @instance_variable ||= "some string"
    end
end

OtherModuleを含む別のモジュールを検討してくださいMyModule。複数回OtherModule呼び出し中のコードが複数回インスタンス化されるのはいつですか? それとも一度だけ?my_method@instance_variable

4

1 に答える 1

1

更新された回答:

  1. デリゲートモジュールがメソッドを呼び出すと、エラーが発生します。
  2. 元のモジュールがメソッドを呼び出す場合、クラスインスタンス変数は1回だけインスタンス化されます。
  3. self.xxモジュールで「クラスメソッド」を定義する場合は、定義してから単純に拡張/インクルードすることはできません。それを「拡張」するか、「固有クラスに含める」必要があります。たとえば、

    module SomeModule
      def self.aim_to_be_class_method ;    end;  
      def aim_to_be_instance_method ;    end;
    end
    
    # class methods:  []
    # instance methods: ["aim_to_be_instance_method"]
    class SomeClassIncludingTheModule
      include SomeModule  
    end
    
    # class methods:  ["aim_to_be_instance_method"]
    # instance methods: []
    class SomeClassExtendingTheModule
      extend SomeModule   
    end
    
    # class methods:  ["aim_to_be_instance_method"]
    # instance methods: []
    class SomeClassMadeEigenClassIncludingModule
      class << self
        include SomeModule
      end
    end
    

あなたのコードは「クラスインスタンス変数」の例です。127ページの本<<metaprogrammingruby >>によると、「クラスインスタンス変数」はJavaの静的フィールドと見なすことができます。ですから、ほとんどの場合、一度実行する必要があると思います。

詳細については、単体テストを作成して、何が起こるかを確認してください。しばらくしてから、自分の単体テストコードを記述して回答を更新します。

更新:私のユニットテストと結果:

# all of the code is placed in a file: class_instance_variable_test.rb

# define a class so that we see its initialize process
class Apple
  def initialize
    puts "Apple initialized~"
  end 
end

# define an original_module that calls Apple.new
module OriginalModule
  def self.original_method
    @var ||= Apple.new
  end 
end

# define another module to call the original_module
module DelegateModule
  include OriginalModule
end

# now the test begins
require 'test/unit'
class ClassInstanceTest < Test::Unit::TestCase

  # output of this test case: 
  # NoMethodError: undefined method `original_method' for DelegateModule:Module      
  def test_if_delegate_module_could_call_original_method_by_including_original_module
    DelegateModule.original_method
  end

  # output of this test case: 
  # ----- calling from original_method, 3 times called, how many times initialized?
  # Apple initialized~
  # ------ ends
  def test_if_we_could_call_original_method_from_original_module
    puts "----- calling from original_method, 3 times called, how many times initialized? "
    OriginalModule.original_method
    OriginalModule.original_method
    OriginalModule.original_method
    puts "------ ends "
  end

end
于 2012-04-04T22:56:59.340 に答える