Ruby模块和扩展自身

15

在什么情况下会用到以下代码:

module M
   extend self
   def greet
    puts "hello"
   end

end

使用它比使用其他东西更有益,例如:

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

在这段代码中,上面的是一个实例方法被扩展,而下面的只是一个类方法,但是当调用任何一个方法时,你必须使用 M.greet,对吧?我只是好奇有没有人能够解释一下何时使用一个代码而不是另一个。谢谢!

3个回答

15

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

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


哦,那是一个很棒的方法。这样你就可以选择给哪些方法功能,以防你不想给所有方法都赋予它。谢谢! - joeellis

10

使用您的第一个示例可以做到这一点,但不适用于第二个示例:

include M
greet

4

通过编写模块方法,可以将模块用作命名空间,并且可以将模块的实例方法混合到另一个对象中。

自我扩展模块的概念允许模块以两种方式使用;作为独立的命名空间或作为混入。考虑下面的模块:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接