Gibt es einen Unterschied zwischen p
und puts
in Ruby?
270
p foo
Druck , foo.inspect
gefolgt von einem Newline, dh sie den Wert drucken inspect
statt to_s
, die für das Debuggen von mehr geeignet ist (weil man zB den Unterschied zwischen sagen 1
, "1"
und "2\b1"
, was man kann nicht beim Drucken ohne inspect
).
p
auch den Wert des Objekts zurückgibt, diesputs
jedoch nicht.1.9.3p125 :002 > (p "foo").class "foo" => String 1.9.3p125 :003 > (puts "foo").class foo => NilClass
to_s
ist die Standard- To -String-Methode in Ruby.inspect
. Wie gesagt, ist eine alternative to-string-Methode, die eine Ausgabe erzeugt, die besser zum Debuggen geeignet ist. Nach Abschluss des Debuggens sollten Sie natürlich Ihre Debugging-Anweisungen entfernen (oder für ernstere Projekte sollten Sie wahrscheinlich ein Protokollierungsframework verwenden und p oder Puts überhaupt nicht zum Debuggen verwenden). Die Tatsache, dassp
das Objekt zurückgegeben wird, scheint in den meisten Situationen irrelevant (und ich glaube, ich habe diese Antwort gegeben, bevor dies der Fall war). Der Unterschied in der Ausgabe ist der Hauptunterschied (und war früher der einzige).Es ist auch wichtig zu beachten, dass
puts
"reagiert" auf eine Klasse, dieto_s
definiert hat,p
nicht. Zum Beispiel:Dies folgt direkt aus dem
.inspect
Aufruf, ist aber in der Praxis nicht offensichtlich.quelle
p foo
ist das gleiche wieputs foo.inspect
quelle
puts
kehrt aber zurücknil
, anstattfoo
wiep
.puts foo.inspect; foo
(-> {p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
. Viele positive Stimmen machen dies NICHT zu einer guten Antwort!Zusätzlich zu den obigen Antworten gibt es einen subtilen Unterschied in der Konsolenausgabe - nämlich das Vorhandensein / Fehlen von Anführungszeichen / Anführungszeichen -, der nützlich sein kann:
Ich finde dies nützlich, wenn Sie einen einfachen Fortschrittsbalken erstellen möchten, indem Sie den nahen Verwandten print verwenden :
Dies gibt den 100% Fortschrittsbalken:
Und dies fügt bei jeder Iteration ein inkrementelles * hinzu:
quelle
Aus Ruby-2.4.1-Dokument
setzt
Lass es uns auf irb versuchen
p
in irb
quelle
Diese 2 sind gleich:
( inspect bietet eine wörtlichere Ansicht des Objekts als die Methode to_s. )
quelle
(->{p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
Dies kann einen der Hauptunterschiede veranschaulichen, der darin besteht,
p
den Wert dessen zurückzugeben, was an ihn übergeben wird, wobei asputs
zurückgegeben wirdnil
.Benchmark-Shows
puts
sind langsamerquelle