Ich bevorzuge immer eine Instanzvariable aus verschiedenen Gründen:
Instanzvariablen entstehen, wenn sie referenziert werden bedeutete, dass, wenn Sie einen Fehler in der Instanz Variablen Rechtschreibung dann machen Es würde Sie definitiv zu einigen Problemen als neue Instanzvariable führen wird auf Null initialisiert. Aber lassen Sie sich NameError holen, wenn Sie falsch schreiben.
Außerdem initialisieren Sie die Instanzvariablen in before Block, was bedeutet, dass vor dem Block jedes Mal ausgeführt wird a Die Spezifikation würde auch dann ausgeführt werden, wenn diese Spezifikation nicht diese Instanzvariablen verwendet Sie haben initialisiert. Beispiel unten angegeben;
%Vor% Obwohl alle Spezifikationen gut laufen, aber @movie
nicht in der ersten Spezifikation verwendet wird und @user
in der zweiten nicht verwendet wird.
Sie können auch let mit bang "!" let!
, let
wird langsam ausgewertet und wird niemals instanziiert, wenn Sie es nicht aufrufen. Verwenden Sie let
, um einen memoisierten Helfer zu definieren, während let!
vor jedem Methodenaufruf zwingend ausgewertet wird.
Ich habe diese Frage bevorzugt, aber am Ende beantworte ich die Frage selbst.
Zuerst die Unterschiede beschreiben
Die let
-Methode initialisiert die Variable nicht, bis sie im Test referenziert wird - was sie von @instance variables
unterscheidet, die vom Start an initialisiert werden.
Im Allgemeinen gibt es keine große Zurückhaltung. Verwenden Sie @instance variables
, wenn Sie sicherstellen möchten, dass let
-Objekt initialisiert ist. Auf der anderen Seite kann dies auch mit let!
gemacht werden, es gibt also keinen offensichtlichen Grund, @instance variable
zu verwenden.
Zusammenfassend ist für mich der offensichtliche Grund, @instance variable
über let
zu verwenden, aber es gibt keinen offensichtlichen Grund, @instance variables
über let!
@instance variables
benötigt mehr Zeit zum Laden und kann dadurch zu unerwünschter Komplexität im Code führen, die durch Verwendung von let
oder let!
Sie können sich auch diese beiden Antworten ansehen, vielleicht gibt es Ihnen weitere Informationen: