Y a-t-il une différence entre p
et puts
en Ruby?
270
p foo
imprime foo.inspect
suivi d'une nouvelle ligne, c'est-à-dire qu'il imprime la valeur de inspect
au lieu de to_s
, ce qui est plus approprié pour le débogage (parce que vous pouvez par exemple faire la différence entre 1
, "1"
et "2\b1"
, ce que vous ne pouvez pas lorsque vous imprimez sans inspect
).
p
renvoie également la valeur de l'objet, alorsputs
que non.1.9.3p125 :002 > (p "foo").class "foo" => String 1.9.3p125 :003 > (puts "foo").class foo => NilClass
to_s
est la méthode standard de chaîne dans Ruby.inspect
. comme je l'ai dit, est une méthode alternative à la chaîne, qui produit une sortie plus adaptée au débogage. À la fin du débogage, vous devez évidemment supprimer vos instructions de débogage (ou pour des projets plus sérieux, vous devriez probablement utiliser un cadre de journalisation et ne pas utiliser du tout p ou put pour le débogage). Le fait quep
retourne l'objet semble hors de propos dans la plupart des situations (et je crois avoir donné cette réponse avant que ce soit le cas). La différence de sortie est la principale différence (et était la seule).Il est également important de noter que
puts
"réagit" à une classe qui l'ato_s
définie,p
ne le fait pas. Par exemple:Cela découle directement de l'
.inspect
appel, mais n'est pas évident en pratique.la source
p foo
est le même queputs foo.inspect
la source
puts
revientnil
, au lieu defoo
le fairep
.puts foo.inspect; foo
(-> {p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
. Beaucoup de votes positifs n'en font PAS une bonne réponse!En plus des réponses ci-dessus, il existe une différence subtile dans la sortie de la console - à savoir la présence / absence de virgules / guillemets inversés - qui peut être utile:
Je trouve cela utile si vous voulez faire une barre de progression simple, en utilisant leur proche parent, imprimez :
Cela donne la barre de progression à 100%:
Et cela ajoute un incrémental * à chaque itération:
la source
Du document ruby-2.4.1
met
essayons sur irb
p
en irb
la source
Ces 2 sont égaux:
( inspect donne une vue plus littérale de l'objet par rapport à la méthode to_s )
la source
(->{p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
Cela peut illustrer l'une des principales différences qui est celle qui
p
renvoie la valeur de ce qui lui est transmis, où en tant queputs
retournil
.L'indice de référence
puts
est plus lentla source