ruby module class-method instance-methods

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