15

代码在什么情况下:

module M
   extend self
   def greet
    puts "hello"
   end

end

使用起来更有益,比如:

module M
   def self.greet
    puts "hello"
   end
end

在顶部,一个是扩展的实例方法,而后者只是一个类方法,但是在调用任一方法时,您都必须 M.greet ,对吗?我只是好奇是否有人可以阐明何时使用一种代码而不是另一种代码。谢谢!

4

3 回答 3

15

第一个示例通常是人们实现功能的一种方式module_function(当他们不知道这种方法的存在时)。

Amodule_function既是实例方法又是类方法。在您的第二个代码示例中,该方法只是一个类方法。

于 2010-07-28T23:48:01.330 回答
10

可以使用您的第一个示例执行此操作,但不能使用您的第二个示例:

include M
greet
于 2010-07-28T22:27:54.983 回答
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

但是,模块只是 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
于 2014-02-14T11:53:18.110 回答