Ruby模块并扩展自我

时间:2010-07-28 22:24:46

标签: ruby module class-method instance-methods

在什么情况下代码:

module M
   extend self
   def greet
    puts "hello"
   end

end

比使用以下内容更有益:

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

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

3 个答案:

答案 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