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