代码在什么情况下:
module M
extend self
def greet
puts "hello"
end
end
使用起来更有益,比如:
module M
def self.greet
puts "hello"
end
end
在顶部,一个是扩展的实例方法,而后者只是一个类方法,但是在调用任一方法时,您都必须 M.greet ,对吗?我只是好奇是否有人可以阐明何时使用一种代码而不是另一种代码。谢谢!
代码在什么情况下:
module M
extend self
def greet
puts "hello"
end
end
使用起来更有益,比如:
module M
def self.greet
puts "hello"
end
end
在顶部,一个是扩展的实例方法,而后者只是一个类方法,但是在调用任一方法时,您都必须 M.greet ,对吗?我只是好奇是否有人可以阐明何时使用一种代码而不是另一种代码。谢谢!
第一个示例通常是人们实现功能的一种方式module_function
(当他们不知道这种方法的存在时)。
Amodule_function
既是实例方法又是类方法。在您的第二个代码示例中,该方法只是一个类方法。
可以使用您的第一个示例执行此操作,但不能使用您的第二个示例:
include M
greet
通过编写模块方法可以将模块用作命名空间,并且可以将模块的实例方法混合到另一个对象中。
自扩展模块概念允许以两种方式使用模块;作为一个独立的命名空间或作为一个 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
但是,模块只是 class 的一个对象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