Czy jest jakaś różnica między Ruby p
i pomiędzy nimi puts
?
270
p foo
wypisuje foo.inspect
znak nowej linii, tzn. wypisuje wartość inspect
zamiast zamiast to_s
, co jest bardziej odpowiednie do debugowania (ponieważ można np. odróżnić 1
, "1"
a od "2\b1"
czego nie można drukować bez inspect
).
p
zwraca również wartość obiektu, podczas gdyputs
nie.1.9.3p125 :002 > (p "foo").class "foo" => String 1.9.3p125 :003 > (puts "foo").class foo => NilClass
to_s
jest standardową metodą ciągów w języku Ruby.inspect
. jak powiedziałem, jest alternatywą dla metody string, która daje wyjście bardziej odpowiednie do debugowania. Po zakończeniu debugowania powinieneś oczywiście usunąć instrukcje debugowania (lub w przypadku poważniejszych projektów prawdopodobnie powinieneś użyć struktury rejestrowania i nie używać p lub putów do debugowania w ogóle). Fakt, że obiekt jestp
zwracany, wydaje się nieistotny w większości sytuacji (i sądzę, że udzieliłem tej odpowiedzi, zanim tak się stało). Różnica w wydajności jest główną różnicą (i kiedyś była jedyną).Należy również zauważyć, że
puts
„reaguje” nato_s
zdefiniowaną klasę ,p
a nie. Na przykład:Wynika to bezpośrednio z
.inspect
połączenia, ale w praktyce nie jest to oczywiste.źródło
p foo
jest taki sam jakputs foo.inspect
źródło
puts
zwracanil
, zamiastfoo
jak robip
.puts foo.inspect; foo
(-> {p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
. Wiele głosów pozytywnych NIE czyni z tego dobrej odpowiedzi!Oprócz powyższych odpowiedzi istnieje subtelna różnica w wynikach konsolowych - mianowicie obecność / brak odwróconych przecinków / cudzysłowów - które mogą być przydatne:
Uważam to za przydatne, jeśli chcesz zrobić prosty pasek postępu, używając ich bliskiego krewnego, wydrukuj :
Daje to pasek postępu 100%:
A to dodaje przyrostowe * przy każdej iteracji:
źródło
Z dokumentu ruby-2.4.1
stawia
spróbujmy na irb
p
w irb
źródło
Te 2 są równe:
( inspekcja daje bardziej dosłowny widok obiektu w porównaniu do metody to_s )
źródło
(->{p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
Może to ilustrować jedną z kluczowych różnic, która polega na tym, że
p
zwraca wartość tego, co jest do niej przekazywane, gdzieputs
zwracanil
.Testy porównawcze
puts
są wolniejszeźródło