variable operador modulos metodo instancia initialize clases clase ruby module

ruby - operador - ¿Variables de instancia en módulos?



variables de clase (4)

¿Cómo es posible que pueda tener variables de instancia en un módulo aunque no pueda crear una instancia del módulo? ¿Cuál sería el propósito de @stack en el módulo Stacklike continuación?

module Stacklike def stack @stack ||= [] end end


Cuando incluya el módulo Stacklike en alguna otra clase, la variable de instancia estará disponible como si estuviera definida en esa clase. Eso le da la opción de establecer y manejar variables de instancia de la clase base desde el propio módulo.


Cuando se incluye un módulo en una clase, todos sus métodos de instancia se "pegan" de manera efectiva a la clase de host. Así que si tienes:

class Lifo include Stacklike end l = Lifo.new l.add_to_stack(:widget)

Entonces ahora @stack una variable de instancia @stack , traída desde Stacklike .


Piense en la variable de instancia como algo que existirá en cualquier clase que incluya su módulo, y las cosas tienen un poco más de sentido:

module Stacklike def stack @stack ||= [] end def add_to_stack(obj) stack.push(obj) end def take_from_stack stack.pop end end class ClownStack include Stacklike def size @stack.length end end cs = ClownStack.new cs.add_to_stack(1) puts cs.size

dará salida a "1"


Vea a continuación:

p RUBY_VERSION module Stacklike def stack @stack ||= [] end def add_to_stack(obj) stack.push(obj) end def take_from_stack stack.pop end end class A include Stacklike end a = A.new p a.instance_variables #<~~ E p a.instance_variable_defined?(:@stack) #<~~ A a.add_to_stack(10) #<~~ B p a.instance_variable_defined?(:@stack) #<~~ C p a.instance_variables #<~~ D

Salida:

"1.9.3" [] false true [:@stack]

Explicación: Sí, las variables de instancia del Module están presentes en la class cuando las include dentro de la clase. Pero puede ver que p a.instance_variable_defined?(:@stack) se muestra false ya que @stack aún no está definido hasta A. En el punto B definí la variable de instancia @stack. Por lo tanto, la declaración en el punto C , da como true . Las medias de las instancias del módulo de medios no están siendo creadas por el propio módulo, pero las instancias de la class pueden hacerlo si la class incluyó ese módulo. La declaración en E produce [] como todavía ese punto en el que no se definió la variable de instancia, pero si ve la salida para la línea D , se demuestra que @stack está dentro del objeto a de class A

¿Por qué tal diseño?

Este es el diseño o algunas veces vienen de los requisitos. Supongamos que se le ha pedido que escriba un código de operación de pila que será utilizado por dos compañías de reservas de boletos, por ejemplo, A y B Ahora A es una política de pila para que sus clientes la atiendan, pero también tienen más formalidades con eso. B empresa B también utiliza la política de pila con sus propios trámites, que es diferente de A Por lo tanto, en el caso de diseñar una operación de Stack dentro de la class A y la class B , es mejor escribirla en un lugar común, ya que tanto A como B tienen esta funcionalidad común dentro de ellos. En el futuro, si viene otra compañía C también puede usar ese módulo en su clase, sin tener que volver a escribir la misma funcionalidad para cada A , B y C Puede haber más pensamientos, pero espero que esto te ayude a responderte por tu última parte de las preguntas.

Eso es todo sobre el concepto. Espero eso ayude.

¡¡Aclamaciones!!