Los módulos de Ruby y se extienden
module class-method (3)
Sería posible hacer esto con su primer ejemplo, pero no el segundo:
include M
greet
En qué tipo de situación está el código:
module M
extend self
def greet
puts "hello"
end
end
más beneficioso para usar más decir algo como:
module M
def self.greet
puts "hello"
end
end
En la parte superior, uno es un método de instancia que se está ampliando, y el último es solo un método de clase, pero cuando se llama a cualquiera de los dos métodos, se debe tener M.greet, ¿no? Solo tenía curiosidad si alguien pudiera arrojar algo de luz sobre cuándo usar un código sobre el otro. ¡Gracias!
El primer ejemplo es típicamente una forma en que las personas logran la funcionalidad de module_function
(cuando no conocen la existencia de este método).
Una función module_function
es a la vez 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.
Un módulo se puede usar como espacio de nombres escribiendo métodos de módulo, y los métodos de instancia de un módulo se pueden mezclar con otro objeto.
El concepto de módulo de autoexpansión permite que un módulo se use en ambos sentidos; ya sea como un espacio de nombres independiente o como un mixin. Considera 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, usarse 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 solo un objeto del Module
de clase, ya que podemos demostrar
puts M.class # => Module
Esto significa 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