Okazuje się, że w rzeczywistości są dwie oceny oceniające dla Swift w lldb, repl
i regularnej komendzie expression
. Oba różnią się w istotny sposób.
Komenda repl
ocenia kod tak, jak zwykły kompilator, który zostałby wprowadzony w nowym pliku modułu Swift, który jest importowany do aktualnie uruchomionej aplikacji. Właściwie, aby być dokładniejszym, każde kolejne wywołanie repl
dodaje kod do takiego modułu, a replik dodaje kilka zaawansowanych funkcji, takich jak możliwość ponownego zdefiniowania klas, na które nie zezwala kompilator Swift. Jest więc najbardziej przydatna do definiowania całych nowych klas, funkcji itp. Posiadanie repl
korzystania z tego globalnego kontekstu jest również konieczne, ponieważ niektóre definicje w Swift mogą być wykonywane tylko na poziomie modułu, a repl
daje dostęp do wszystkich tych funkcji język. OTOH, oznacza to z definicji, że polecenie repl
nie ma widoczności w kontekście, w którym uruchamiana jest komenda repl
.
Komenda expression
koduje kod tak, jakby działał w kontekście funkcji, w której aktualnie się zatrzymałeś. Jest to przydatne, ponieważ daje dostęp do ivars i lokalnych zmiennych i naprawdę działa jak kod, który może być w tym szczególny kontekst. Ale efekt uboczny wykonywania tej sztuczki polega na tym, że nie może ona być dokładnie taka, jak stworzenie nowego modułu - co ma naśladować emulator. Uwaga: rzeczy, których nie można wykonać w expr
są dość ezoteryczne i często można uciec z budowaniem klas zarysowania i tym podobnych w poleceniu expression
. Chcesz użyć polecenia expr
, aby uruchomić polecenie println(self)
.
Krótko mówiąc, jeśli chcesz ugotować nowe klasy itp. Podczas debugowania, użyj polecenia repl
, ale jeśli chcesz uzyskać dostęp do zmiennych lokalnych itp., Użyj expr
.
Uwaga, aby rzeczy nieco bardziej zagmatwały, repl
jest rzeczywiście smak lub expr
. Jeśli spojrzysz na pomoc lldb dla repl, powiesz, że polecenie jest aliasem dla expression -r --
. Niektórzy używają również innego aliasu: print
, który jest expression --
. Ten alias jest po prostu przydatny do wyłączenia analizowania opcji przy wpisywaniu prawdziwego wyrazu do polecenia ...
Naprawdę miło wyjaśnia, dziękuję. Czy sądzisz, że w przyszłych wersjach będzie można uzyskać dostęp do zmiennych lokalnych w REPL? –
Nie mogę tego przewidzieć. –