Ruby module_function,调用模块的私有方法,在模块的类方法样式中调用显示错误

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中可以看出,当将模块包含在类中时,当从模块函数调用模块的私有方法时,如果在类方法样式中直接调用模块上的模块函数,则不会出现问题找不到模块函数调用的模块私有方法.

任何人都可以让我理解上面行为背后的原因,是否可以在类方法样式中调用模块函数(进而调用模块的私有方法)?如果可能的话,我的代码中需要做哪些修正才能做同样的事情?

psy*_*yho 7

当您将模块包含在类中时,它可以工作,因为然后所有模块的方法都包含在该类中(selfmodule_func_aMyClass,也有private_b方法).

在其他情况下自我指向MyModule,其中没有private_b方法.如果你希望它是双向的,你必须要么声明private_b为模块方法为好,或干脆添加一行extend selfMyModule,让所有它的方法将成为模块的方法.

  • @pysho - 你能给我一个例子,或者给我一个链接,提供你如何使用你提到的代表团的详细信息吗? (2认同)