objetos modulos manejo instancias instanciar importar herencia clases ruby

ruby - modulos - ¿Cuál es el propósito de los métodos de instancia en Módulos sin clases?



manejo de objetos en ruby (2)

Imagina el siguiente Módulo Ruby:

module Foo def inst_method puts "Called Foo.inst_method" end def self.class_method puts "Called Foo.class_method" end end

Obviamente, se puede llamar a Foo.class_method sin ninguna instancia de clase. Sin embargo, ¿qué le está pasando a Foo.inst_method ? ¿Es posible llamar a Foo.inst_method sin incluir / extender previamente una clase?

Descargo de responsabilidad: la pregunta no se centra en resolver un problema real. Solo trato de mejorar mi comprensión del sistema de objetos Ruby.


El objetivo principal de los métodos de instancia dentro de los módulos es dar esa funcionalidad a las clases que lo incluyen.

"Mezclar en" un módulo de esta manera es más comúnmente utilizado como método de simulación de herencia múltiple , o en otras situaciones donde la herencia no es el paradigma correcto (no es una perfecta "relación") pero desea compartir el comportamiento. Es una herramienta más para mantener tu código SECO .

Un buen ejemplo de esto en el núcleo de Ruby es observar cómo Array y Hash pueden ser recorridos y ordenados, etc. Cada uno obtiene esta funcionalidad del módulo Enumerable ( each_with_index , select , reject , sort y más están todos definidos en el módulo incluido, no en las clases).


Mi respuesta sería: "no, no puedes llamar a los métodos de instancia del módulo sin antes extender o incluir ese módulo en una clase"

Ahora que conozco Ruby y todos los trucos de meta-programación que contiene probablemente haya una manera de llamarlo, pero estaría fuera del uso previsto de los módulos.

module Tester def inst_meth puts "test inst meth/n" end def self.meth puts "test self meth/n" end end begin Tester.meth rescue; puts $! end begin Tester.inst_meth rescue puts $! end begin Tester.new.inst_meth rescue puts $! end begin extend Tester inst_meth rescue puts $! end begin include Tester inst_meth rescue puts $! end

da

>ruby test.rb test self meth undefined method `inst_meth'' for Tester:Module undefined method `new'' for Tester:Module test inst meth test inst meth