gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:53:42 27 4
gpt4 key购买 nike

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

任何人都可以让我理解上述行为背后的原因,以及是否可以以类方法样式在模块上调用模块函数(反过来调用模块的私有(private)方法)?如果可能,那么我的代码中需要进行哪些更正才能做到这一点?

最佳答案

当您将模块包含在一个类中时,它会起作用,因为所有模块的方法都会包含在该类中(module_func_a 中的 self 指向 MyClass,它也有 private_b 方法)。

在另一种情况下,self 指向 MyModule,它没有 private_b 方法。如果您希望它以两种方式工作,则必须将 private_b 也声明为模块方法,或者只需将行 extend self 添加到 MyModule ,这样它的所有方法都将成为模块方法。

关于Ruby module_function,调用模块的私有(private)方法,在模块的类方法样式中调用显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10042807/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com