Jig*_*hel 8 ruby module private-methods
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
Run Code Online (Sandbox Code Playgroud)
从类调用模块函数
c = MyClass.new
c.test_module
Run Code Online (Sandbox Code Playgroud)
输出1:
$ ruby test_module.rb
module_func_a invoked
private_b invoked
Run Code Online (Sandbox Code Playgroud)
在类方法样式中调用模块上的模块函数
ma = MyModule.module_func_a
Run Code Online (Sandbox Code Playgroud)
输出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
Run Code Online (Sandbox Code Playgroud)
从输出1和输出2中可以看出,当将模块包含在类中时,当从模块函数调用模块的私有方法时,如果在类方法样式中直接调用模块上的模块函数,则不会出现问题找不到模块函数调用的模块私有方法.
任何人都可以让我理解上面行为背后的原因,是否可以在类方法样式中调用模块函数(进而调用模块的私有方法)?如果可能的话,我的代码中需要做哪些修正才能做同样的事情?
当您将模块包含在类中时,它可以工作,因为然后所有模块的方法都包含在该类中(self入module_func_a点MyClass,也有private_b方法).
在其他情况下自我指向MyModule,其中没有private_b方法.如果你希望它是双向的,你必须要么声明private_b为模块方法为好,或干脆添加一行extend self到MyModule,让所有它的方法将成为模块的方法.
| 归档时间: |
|
| 查看次数: |
4354 次 |
| 最近记录: |