2010-07-28 8 views
13

En qué tipo de situación es el código:módulos Ruby y extender auto

module M 
    extend self 
    def greet 
    puts "hello" 
    end 

end 

más beneficioso utilizar más de decir algo como:

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

En la parte superior, uno es un ser método de instancia extendido, y el último es solo un método de clase, pero al llamar a cualquiera de los métodos, tendrías que saludar a M., ¿no? Solo tenía curiosidad si alguien pudiera arrojar algo de luz sobre cuándo usar un código sobre el otro. ¡Gracias!

Respuesta

13

El primer ejemplo es típicamente una forma personas a lograr la funcionalidad de module_function (cuando no saben de la existencia de este método).

A module_function es un método de instancia y un método de clase. En su segundo ejemplo de código, el método es solo un método de clase.

+0

Oh, ese es un método genial. De esta forma, puede seleccionar a qué métodos otorgarle la funcionalidad en caso de que no quiera dársela a todos. ¡Gracias! – joeellis

9

Sería posible hacer esto con su primer ejemplo, pero no el segundo:

include M 
greet 
2

Un módulo se puede utilizar como espacio de nombres escribiendo métodos de módulo, y los métodos de instancia de un módulo se pueden mezclar en otro objeto.

El concepto de módulo autoextendido permite utilizar un módulo de ambas maneras; ya sea como un espacio de nombres independiente o como un mixin. Considere este módulo:

module M 
    def bar 
    puts "bar" 
    end 
end 
class C 
    include M 
end 

Tiene un método de instancia y se puede mezclar en otro objeto. No tiene un método de módulo y no puede, por lo tanto, ser utilizado como un espacio de nombres:

puts M::bar # => undefined method `bar' for M:Module 
puts C.bar # => this is bar 

Pero, un módulo es un simplemente un objeto de clase Module, como podemos demostrar

puts M.class # => Module 

Estos medios que podemos hacer algo loco Podemos mezclar un módulo en sí mismo para que sus métodos se conviertan en métodos de instancia y de módulo.

module M 
    extend self 
    def bar 
    puts "bar" 
    end 
end 
puts M::bar # => this is bar 
puts C.bar # => this is bar 
Cuestiones relacionadas