给出以下代码:
module Foo
class Bar
def some_method
end
def self.another_method
end
end
end
如果我想与rubyist讨论实例方法some_method
,我会说Foo::Bar#some_method
。
如果我想谈论类方法another_method
,我会说Foo::Bar::another_method
。
但如果Bar
是一个模块,该怎么办:
module Foo
module Bar
def some_method
end
def self.another_method
end
end
end
约定是否相同?
答案 0 :(得分:0)
是
术语不同但是,类有方法,但对于模块,它们有时被称为函数。
我的来源是" Ruby in a Nutshell"马茨的书。他将模块上定义的方法称为模块函数,因此也称为Module.module_function
方法的名称。同一本书有一章关于内置函数,如exit
等,它们在Kernel
模块上定义。
有趣的事实,那些"功能"似乎全局可用,因为Object
包含Kernel
,因此其所有模块函数都成为任何对象的私有方法,因此可以从任何上下文调用。期待BasicObject
,但这是另一个故事。
或者"问Ruby"正如埃里克建议的那样
[1] pry(main)> module B
[1] pry(main)* def m
[1] pry(main)* end
[1] pry(main)* def self.n
[1] pry(main)* end
[1] pry(main)* module_function
[1] pry(main)* def f
[1] pry(main)* end
[1] pry(main)* end
=> nil
[2] pry(main)> B.instance_method(:m)
=> #<UnboundMethod: B#m>
[3] pry(main)> B.method(:n)
=> #<Method: B.n>
[4] pry(main)> B.method(:f)
=> #<Method: B.f>
三个观察
Module.fun
答案 1 :(得分:0)
当谈论这段代码时, [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
[Key]
将被称为实例方法Foo::Bar#some_method
。 some_method
我会调用类方法Foo::Bar.another_method
。
在模块的上下文中,我将another_method
称为模块方法。而像实例方法之类的东西在模块的上下文中没有意义。您可能想要将其称为函数。
答案 2 :(得分:0)
是的,这是完全相同的惯例,原因很简单:
Class
继承自Module
。instance_methods
方法在Module
。