Siehe unten:
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
Ausgang:
"1.9.3"
[]
false
true
[:@stack]
Erläuterung: Ja, Module
Instanzvariablen in den class
vorhanden sind, wenn man sich in der Klasse include
würde. Aber Sie können sehen, dass zeigt false
als @stack
ist immer noch nicht definiert bis A. Unter Punkt B habe ich die Instanzvariable @stack definiert. So lautet die Aussage in Punkt C, Ausgaben wie true
. Die Modulinstanzvariablen werden nicht vom Modul selbst erzeugt, sondern können von den class
Instanzen ausgeführt werden, wenn das class
dieses Modul enthält. Statement in E Ausgängen []
als noch die Instanzvariablen dieser Punkt wurde nicht definiert, aber wenn Sie die Ausgabe für die Linie D siehe ist es bewiesen, die @stack
innerhalb des Objekts a
von class A
ist.
Warum solch ein Design?
Dies ist das Design oder manchmal kommen von den Anforderungen. Angenommen, Sie wurden aufgefordert, einen Stapeloperationscode zu schreiben, der von zwei Ticketbuchungsfirmen verwendet wird, Sagen Sie A
und B
. Jetzt A
sind Stack-Politik für ihre Kunden zu bedienen, aber sie haben mehr Formalitäten damit. B
Firma verwendet auch Stack-Politik mit ihren eigenen Formalitäten, die sich von A
unterscheidet. So im Falle des Entwerfens Operation innerhalb class A
und class B
, bessere Idee, es in einen allgemeinen Platz zu schreiben, wie sowohl A
als auch B
diese Funktionalität haben, die in ihnen üblich ist.Wenn in Zukunft eine andere Firma C
zu Ihnen kommt, können Sie dieses Modul auch in ihrer Klasse verwenden, ohne die gleiche Funktionalität für jede A
, B
und C
neu zu schreiben. Es kann mehr Gedanken geben, aber hoffen, dass dies dir hilft, dir selbst für deinen letzten Teil der Fragen zu antworten.
Das ist alles über das Konzept. Ich hoffe es hilft.
Prost !!
Wenn Sie Instanzvariablen verwenden/initialisieren möchten, berücksichtigen Sie die Vererbung anstelle von mixin. –