是否可以在ruby中的模块中声明静态方法?
module Software
def self.exit
puts "exited"
end
end
class Windows
include Software
def self.start
puts "started"
self.exit
end
end
Windows.start
上面的例子不会打印出“退出”。
是否只能在模块中使用实例方法?
答案 0 :(得分:31)
像这样定义你的模块(即make exit
模块中的实例方法):
module Software
def exit
puts "exited"
end
end
然后使用extend
而不是include
class Windows
extend Software
# your self.start method as in the question
end
使用中:
irb(main):016:0> Windows.start
started
exited
=> nil
<强>解释强>
obj.extend(module, ...)增加了 obj 来自作为参数
的每个模块的实例方法
...因此,当在类定义的上下文中使用(类本身作为接收者)时,方法将成为类方法。
答案 1 :(得分:18)
将您的类方法放在嵌套模块中,然后覆盖“included”挂钩。只要包含模块,就会调用此挂钩。在钩子内部,将类方法添加到包含的任何人:
module Foo
def self.included(o)
o.extend(ClassMethods)
end
module ClassMethods
def foo
'foo'
end
end
end
现在任何包括Foo的类都会获得一个名为foo的类方法:
class MyClass
include Foo
end
p MyClass.foo # "foo"
任何非类方法都可以像往常一样在Foo中定义。
答案 2 :(得分:2)
需要更改两件事才能调用Windows.exit
:
Software#exit
需要是一个实例方法Windows
需要extend
Software
,而不是include
。这是因为extend
另一个模块将该模块的实例方法作为当前模块的类方法,而include
模块将方法作为新实例方法。
module Software
def exit
puts "exited"
end
end
class Windows
extend Software
def self.start
puts "started"
self.exit
end
end
Windows.start
输出是:
started exited
答案 3 :(得分:0)
可以在模块中包含静态方法:
module Software
def self.exit
puts "exited"
end
end
Software.exit
运行此按预期打印'退出'。