对象Ruby中的模块方法



我在理解Ruby的全局可见性方面有困难,所以,我知道你不能在自己的类中使用Module方法,例如:

module Mod
def self.meth
“module method”
end
end
class Klass
include Mod
end
p Klass.meth
# Error

但是当我知道你可以做这样的事情时:

include Math
p sin 2
#0.909....

我很困惑,因为我认为你不能在任何类中使用模块方法而不调用方法名。我也有一个假设,模块数学有实例方法,如内核,但不幸的是,没有。现在我怀疑,我是否正确理解了像extend和include这样的方法,所以,你能给我解释一下这件事吗?如果我们将include更改为extend

会发生什么?

你遇到了一个奇怪的module_function: https://apidock.com/ruby/Module/module_function/

module Foo
def foo # this is (irb) 2
end
end
Foo.singleton_methods #=> []
Foo.instance_methods #=> [:foo]
Foo.instance_method(:foo).source_location #=> ["(irb)", 2]
module Foo
module_function :foo # this is (irb) 9
end
Foo.singleton_methods #=> [:foo]
Foo.singleton_method(:foo).source_location #=> ["(irb)", 2]
Foo.instance_methods #=> []
Foo.private_instance_methods #=> [:foo]
Foo.instance_method(:foo).source_location #=> ["(irb)", 2]

因此,module_function获取模块的实例方法,使其为私有并将其复制到单例类中。

module_function也可以不带方法名使用,它的工作原理有点像private方法,可以修改将来添加到该模块的所有方法。

Math是一个完整的module_function模块,这意味着方法既被定义为单例方法,也被定义为私有实例方法,这就是为什么你可以以两种方式使用它。

相关内容

  • 没有找到相关文章

最新更新