Debugowanie za pomocą Pry
przegląd
omówimy Pry, rodzaj REPL, i omówimy, jak zainstalować i używać go do debugowania programu.
- wyjaśnij, jak Pry jest bardziej elastycznym REPL niż IRB.
- zainstaluj Pry na swoim komputerze (już zainstalowany dla użytkowników IDE).
- Debuguj program za pomocą wiązania.wścibska w treści Twoich akt.
Co to jest REPL?
zostałeś już wprowadzony do repli poprzez użycie IRB (Interactive Ruby).REPL oznacza Read, Evaluate, Print, Loop. Jest to interaktywne środowisko programistyczne, które pobiera dane wejściowe użytkownika, ocenia je i zwraca użytkownikowi wynik.
Ruby instaluje się z własnym REPL, czyli IRB, którego już używałeś.Za każdym razem, gdy wpiszesz irb
do swojego terminala, wprowadzasz REPL.
Co To Jest Pry?
Pry to kolejny REPL Ruby z pewną dodaną funkcjonalnością. Po wejściu do IRB, typodejście do zupełnie nowego interaktywnego środowiska. Każdy kod, który chcesz zagrać w IRB, musisz napisać w IRB lub skopiować i wkleić do IRB. Pry, z drugiej strony, jest jak REPL, który można wstrzyknąć do programu.
Pry jest znacznie bardziej elastyczny niż IRB. Po zainstalowaniu biblioteki Pry (poprzez Prygem-przejdziemy przez instalację za chwilę), możesz użyć binding.pry
w dowolnym miejscu kodu.
czekaj… Co to jest „Wiązanie”?
powiązanie jest wbudowaną klasą ruby, której obiekty mogą hermetyzować kontekst bieżącego zakresu (zmienne, metody itp.) i zachowują je do użytku poza kontekstem.
wywołanie binding.pry
jest zasadniczo „wścibskiem” w bieżące powiązanie lub kontekst kodu, spoza twojego pliku.
więc po umieszczeniu linii binding.pry
w kodzie, linia ta zostanie zinterpretowana podczas wykonywania programu. Kiedy interpreter trafi w tę linię, Twój program faktycznie zawiesi się, a twój terminal zmieni się w REPL, który istnieje w samym środku twojego programu, gdziekolwiek dodałeś liniębinding.pry
.
W tym repozytorium zobaczysz plik o nazwiepry_is_awesome.rb
.
Instrukcja Cz. I
-
Fork i sklonować to repozytorium.
-
zainstaluj Pry na swoim komputerze, przechodząc do katalogu domowego (
cd ~
inyour terminal) i wykonajgem install pry
. (Nie musisz tego robić, jeśli pracujesz w IDE.) -
spójrz na kod w
lib/pry_is_awesome.rb
powinieneś zobaczyć następujący kod:
require 'pry'def prying_into_the_method inside_the_method = "We're inside the method" puts inside_the_method puts "We're about to stop because of pry!" binding.pry this_variable_hasnt_been_interpreted_yet = "The program froze before it could read me!" puts this_variable_hasnt_been_interpreted_yetendprying_into_the_method
tutaj wymagamy pry
, co musisz zrobić,aby użyć pry, zdefiniowania metody, a następnie wywołania tej metody.
w katalogu tego repo, w terminalu uruchom plik wpisując rubylib/pry_is_awesome.rb
. Spójrz na swój terminal. Powinieneś zobaczyć coś takiego.:
3: def prying_into_the_method 4: inside_the_method = "We're inside the method" 5: puts inside_the_method 6: puts "We're about to stop because of pry!" 7: binding.pry => 8: this_variable_hasnt_been_interpreted_yet = "The program froze before it could read me!" 9: puts this_variable_hasnt_been_interpreted_yet 10: end pry(main)>
zamroziłeś swój program podczas jego wykonywania i jesteś teraz wewnątrz REPL insideyour program. Po prostu zatrzymałeś czas! Czy to nie fajne?
w terminalu, w konsoli pry wpisz nazwę zmiennej inside_the_method
i naciśnij enter. Powinieneś zobaczyć wartość zwracaną "We're inside the method"
jesteś w stanie zbadać dane wewnątrz metody, w której umieściłeś yourbinding.
teraz w terminalu, w konsoli pry wpisz nazwę zmiennejthis_variable_hasnt_been_interpreted_yet
. Powinieneś zobaczyć wartość zwracanąnil
. To dlatego, że wiązanie, które umieściłeś na linii 7, faktycznie zamroziło program na linii 7, a zmienna, którą właśnie wywołałeś, nie została jeszcze zinterpretowana.W związku z tym nasza REPL o tym nie wie.
teraz w terminalu wpisz exit
, a opuścisz konsolę pry i program będzie kontynuowany.
instrukcje Część II: używanie Pry do debugowania
oprócz eksploracji kodu wewnątrz Pry, możesz także manipulować zmiennymi i wypróbowywać kod. To tutaj Pry naprawdę staje się pomocny w debugowaniu. Jeśli masz metodę, która nie robi tego, co powinna, zamiast wprowadzać zmiany w edytorze tekstu i przeprowadzać testy w kółko, dopóki nie zaczniesz pracować, możesz umieścić powiązanie w kodzie i wypróbować różne rzeczy. Po ustaleniu, jak rozwiązać problem, zaktualizujesz kod w edytorze tekstu zgodnie.
przejdźmy razem przez przykład. W tym repozytorium, które rozwidlałeś i sklonowałeś na swoim komputerze, zobaczysz folder spec
zawierający plikpry_debugging_spec.rb
. Jest to test dla pliku lib/pry_debugging.rb
.
w pry_debugging.rb
mamy złamaną metodę. Uruchom learn test
, aby zobaczyć test. Powinieneś zobaczyć następujące:
1) #plus_two takes in a number as an argument and returns the sum of that number and 2 Failure/Error: expect(plus_two(3)).to eq(5) expected: 5 got: 3 (compared using ==) # ./spec/pry_debugging_spec.rb:6:in `block (2 levels) in <top (required)>'
co się dzieje? W drugim wierszu (linia zaczynająca się odFailure/Error
) widzimy, że test wywołuje metodę plus_two
i jako argument podaje w 3
. Poniżej widzimy, że test oczekuje zwracania wartości5
, ale zamiast tego zwracana jest wartość 3
. Pamiętamy, że wartość thereturn metody w Rubim jest na ogół wartością ostatniej linii thethod, w tym przypadku num
:
def plus_two(num) num + 2 numend
więc podczas gdy nasza metoda dodaje 2 do num
w drugiej linii, wygląda na to, że nie aktualizuje num
. Mamy Pry wymagane na górze naszego plikuspec/pry_debugging_spec.rb
, więc możemy go użyć do weryfikacji tego. Umieśćmybinding.pry
w naszym kodzie, zaraz po tej linijce:
def plus_two(num) num + 2 binding.pry numend
teraz ponownie uruchom pakiet testowy i wskocz do konsoli Pry. Twój terminal powinien wyglądać tak:
From: /Users/sophiedebenedetto/Desktop/Dev/Ruby-Methods_and_Variables/pry-readme/lib/pry_debugging.rb @ line 4 Object#plus_two: 1: def plus_two(num) 2: num + 2 3: binding.pry => 4: num 5: end pry(#<RSpec::ExampleGroups::PlusTwo>)>
sprawdźmy naszą bieżącą wartość zwracaną, wpisując num
w wierszu PRY. Powinieneś zobaczyć coś takiego.:
pry(#<RSpec::ExampleGroups::PlusTwo>)> num=> 3 pry(#<RSpec::ExampleGroups::PlusTwo>)>
sprawdzając wartość zmiennej wewnątrz naszej konsoli pry, możemy potwierdzić, że num
jest nadal równa 3
i w rezultacie metoda zwraca 3
.
jak możemy zmodyfikować kod w linii 2, aby metoda zachowywała się w oczekiwanym czasie? Musimy zaktualizować wartość naszej zmiennej num
tak, aby była równa sumie siebie i 2. Baw się wewnątrz konsoli Pry: wypróbuj kod, który według youthink zaktualizuje num
w razie potrzeby, a następnie sprawdź wartość num
, aby sprawdzić, czy działa. Gdy już się zorientujesz, możesz wpisać exit
w swoim terminalu, aby wydostać się z Pry, zaktualizować kod w edytorze tekstu i ponownie uruchomić test, aby zweryfikować go. Pamiętaj, aby usunąć binding.pry
!
może trochę potrwać, zanim zaczniesz używać Pry, więc nie martw się, jeśli będzie to trochę mylące. Gdy zaczniesz pracować z bardziej złożonymi metodami istrukturami danych, przekonasz się, że może to być bardzo pomocne narzędzie.