Смотрите ниже:
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
Выход:
"1.9.3"
[]
false
true
[:@stack]
Пояснение: Да, Module
переменные экземпляра присутствуют в class
когда вы include
их внутри класса. Но вы можете видеть, что p a.instance_variable_defined?(:@stack)
показывает false
как @stack
еще не определен до A. В точке B Я определил переменную экземпляра @stack. Таким образом, утверждение в пункте C, выходы как true
. Средние переменные экземпляра модуля не создаются самим модулем, но это может быть сделано экземплярами class
, если в этот модуль включен class
. Заявление в E выходы []
, как до сих пор эта точка переменная экземпляра не была определена, но если вы видите выход для линии D , она доказана @stack
внутри объекта a
из class A
.
Почему такой дизайн?
Это дизайн или иногда исходит из требований. Скажите, что вас попросили написать код операции стека, который будет использоваться двумя компаниями по бронированию билетов, скажем A
и B
. Теперь A
- политика стека для своих клиентов, чтобы обслуживать, но также они имеют больше формальности с этим. B
компания также использует политику стека со своими формальностями, которая отличается от A
. Таким образом, в случае проектирования Stack
операции внутри class A
и class B
, лучше написать его в обычном месте, так как оба A
и B
имеют общую функциональность в них.В будущем, если к вам придет другая компания C
, вы также можете использовать этот модуль в своем классе, не переписывая одну и ту же функциональность для каждого A
, B
и C
. Могут быть больше мыслей, но надеюсь, что это поможет вам ответить на вопрос о своей последней части вопросов.
Это все о концепции. Надеюсь, поможет.
Cheers !!
Если вы хотите использовать/инициализировать переменные экземпляра, рассмотрите наследование вместо mixin. –