在什么情况下代码:
module M
extend self
def greet
puts "hello"
end
end
比使用以下内容更有益:
module M
def self.greet
puts "hello"
end
end
在顶部,一个是扩展的实例方法,后者只是一个类方法,但在调用任一方法时,你必须使用M.greet,对吧?我很好奇是否有人可以说明何时使用一个代码而不是另一个代码。谢谢!
答案 0 :(得分:15)
第一个示例通常是人们实现module_function
功能的方式(当他们不知道此方法的存在时)。
module_function
既是实例方法又是类方法。在你的第二个代码示例中,该方法只是一个类方法。
答案 1 :(得分:10)
可以用你的第一个例子做到这一点,但不是你的第二个例子:
include M
greet
答案 2 :(得分:4)
通过编写模块方法可以将模块用作命名空间,并且可以将模块的实例方法混合到另一个对象中。
自扩展模块概念允许以两种方式使用模块;要么作为独立命名空间,要么作为mixin。考虑一下这个模块:
module M
def bar
puts "bar"
end
end
class C
include M
end
它有一个实例方法,可以混合到另一个对象中。它没有模块方法,因此无法用作命名空间:
puts M::bar # => undefined method `bar' for M:Module
puts C.bar # => this is bar
但是,模块只是类Module
的一个对象,我们可以演示
puts M.class # => Module
这意味着我们可以做一些疯狂的事情。我们可以将模块混合到自身中,使其方法成为实例和模块方法。
module M
extend self
def bar
puts "bar"
end
end
puts M::bar # => this is bar
puts C.bar # => this is bar