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!!