module MyModule
def self.my_method
@instance_variable ||= "some string"
end
end
OtherModule
を含む別のモジュールを検討してくださいMyModule
。複数回OtherModule
呼び出し中のコードが複数回インスタンス化されるのはいつですか? それとも一度だけ?my_method
@instance_variable
module MyModule
def self.my_method
@instance_variable ||= "some string"
end
end
OtherModule
を含む別のモジュールを検討してくださいMyModule
。複数回OtherModule
呼び出し中のコードが複数回インスタンス化されるのはいつですか? それとも一度だけ?my_method
@instance_variable
更新された回答:
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