Es gibt tatsächlich zwei Ausdruck Evaluatoren für Swift in lldb, der repl
und der reguläre expression
Befehl. Die beiden unterscheiden sich in wichtigen Punkten.
Der Befehl repl
wertet den Code als regulären Swift-Compiler aus, wenn er in einer neuen Swift-Moduldatei eingegeben wird, die in die aktuell ausgeführte App importiert wird. Um genauer zu sein, fügt jeder nachfolgende Aufruf von repl
Code zu einem solchen Modul hinzu, und der repl fügt einige mächtige Merkmale hinzu, wie zum Beispiel Klassen neu definieren zu können, die der Swift-Compiler nicht erlaubt. Daher ist es am nützlichsten, ganz neue Klassen, Funktionen usw. zu definieren. Die Verwendung des globalen Kontextes repl
ist auch notwendig, weil einige Definitionen in Swift nur auf der Modulebene durchgeführt werden können und repl
Ihnen Zugriff auf alle diese Funktionen der Sprache. OTOH, das bedeutet ziemlich genau per Definition der repl
Befehl hat keine Sichtbarkeit in den Kontext, in dem Sie den repl
Befehl ausführen.
Der Befehl expression
wertet Code so aus, als würde er im Kontext der Funktion ausgeführt, in der Sie gerade angehalten werden. Dies ist nützlich, da Sie auf ivars und lokale Variablen zugreifen und sich wirklich wie Code verhalten bestimmter Kontext. Aber ein Nebeneffekt der Ausführung dieses Tricks ist, dass es nicht genau so sein kann wie ein neues Modul zu erstellen - was repl
emulieren soll. Beachten Sie, dass die Dinge, die Sie in expr
nicht tun können, ziemlich esoterisch sind, und Sie können oft mit dem Erstellen von Scratch-Klassen und dergleichen im expression
-Befehl davonkommen. Sie möchten expr
verwenden, um Ihren println(self)
Befehl auszuführen.
Kurz gesagt, wenn Sie neue Klassen usw. beim Debuggen kochen möchten, verwenden Sie den Befehl repl
, aber wenn Sie auf lokale Variablen usw. zugreifen möchten, verwenden Sie expr
.
Hinweis, um Dinge etwas verwirrender zu machen, repl
ist eigentlich ein Geschmack oder expr
. Wenn Sie sich die lldb-Hilfe für repl ansehen, wird Ihnen mitgeteilt, dass der Befehl ein Alias für expression -r --
ist. Einige Leute verwenden auch einen anderen Alias: print
, der expression --
ist. Dieser Alias ist nur praktisch, um das Parsen von Optionen zu deaktivieren, wenn Sie Ihren echten Ausdruck in den Befehl eingeben ...
Wirklich nett erklären, danke. Glauben Sie, dass in zukünftigen Releases auf lokale Variablen in REPL zugegriffen werden kann? –
Nicht dass ich vorhersehen kann. –