test_module.rb
module MyModule
def module_func_a
puts "module_func_a invoked"
private_b
end
module_function :module_func_a
private
def private_b
puts "private_b invoked"
end
end
class MyClass
include MyModule
def test_module
module_func_a
end
end
クラスからモジュール関数を呼び出す
c = MyClass.new
c.test_module
出力1:
$ ruby test_module.rb
module_func_a invoked
private_b invoked
クラスメソッドスタイルのモジュールでモジュール関数を呼び出す
ma = MyModule.module_func_a
出力2:
module_func_a invoked
test_module.rb:5:in `module_func_a': undefined local variable or method `private_b' for MyModule:Module (NameError)
from test_module.rb:31
モジュールをクラスに含める場合の出力1と出力2からわかるように、モジュールのプライベートメソッドがモジュール関数から呼び出されても、クラスメソッドスタイルでモジュールのモジュール関数を直接呼び出す場合は問題は発生しません。モジュール関数から呼び出されたモジュールのプライベートメソッドが見つかりません。
上記の動作の背後にある理由と、クラスメソッドスタイルのモジュールでモジュール関数(モジュールのプライベートメソッドを呼び出す)を呼び出すことが可能かどうかを誰かに理解させることができますか?可能であれば、同じことを行うためにコードでどのような修正が必要ですか?