Patrz poniżej:
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
wyjściowa:
"1.9.3"
[]
false
true
[:@stack]
Objaśnienie: Tak, Module
instancji zmienne są obecne w class
kiedy byś include
je wewnątrz klasy. Ale widać, że p a.instance_variable_defined?(:@stack)
pokazuje false
jako @stack
nadal nie jest zdefiniowany do A. W punkcie B Zdefiniowałem zmienną instancji @stack. Tak więc oświadczenie w punkcie C, wyprowadza jako true
. Zmienne instancji modułu nie są tworzone przez sam moduł, ale można to zrobić za pomocą instancji class
, jeśli moduł ten zawierał class
. Oświadczenie w E wyjścia []
jako że jeszcze punkt zmienna instancji nie została określona, ale jeśli widzisz wyjście dla linii D, to okazał się @stack
jest wewnątrz obiektu a
z class A
.
Dlaczego taki projekt?
To jest projekt, a czasem wynika z wymagań. Załóżmy, że zostałeś poproszony o napisanie kodu operacji stosu, który będzie używany przez dwie firmy zajmujące się rezerwowaniem biletów, Powiedz A
i B
. Teraz A
to zasady dotyczące kupowania dla klientów, którzy mają służyć, ale także mają dodatkowe formalności. B
Firma również stosuje politykę stosu z własnymi formalnościami, która różni się od A
. Tak więc w przypadku projektowania wewnątrz class A
i class B
, lepszym pomysłem jest napisanie go we wspólnym miejscu, ponieważ Zarówno A
, jak i B
mają wspólną wspólną dla nich funkcjonalność.W przyszłości, jeśli pojawi się inna firma C
, możesz również użyć tego modułu w swojej klasie, bez przepisywania tej samej funkcjonalności dla każdego z następujących A
, B
i C
. Może być więcej myśli, ale mam nadzieję, że to pomoże ci odpowiedzieć sobie na ostatnią część pytań.
To wszystko na temat koncepcji. Mam nadzieję, że to pomoże.
Pozdrawiam!
Jeśli chcesz użyć/zainicjować zmienne instancji, rozważ dziedziczenie zamiast mixin. –