¿Hay alguna diferencia entre p
y puts
en Ruby?
270
p foo
imprime foo.inspect
seguido de una nueva línea, es decir, imprime el valor de en inspect
lugar de to_s
, que es más adecuado para la depuración (porque, por ejemplo, puede distinguir la diferencia entre 1
, "1"
y "2\b1"
, que no puede imprimir sin inspect
).
p
también devuelve el valor del objeto, mientrasputs
que no.1.9.3p125 :002 > (p "foo").class "foo" => String 1.9.3p125 :003 > (puts "foo").class foo => NilClass
to_s
es el método estándar para encadenar en Ruby.inspect
. Como dije, es un método alternativo para cadenas, que produce una salida más adecuada para la depuración. Una vez completada la depuración, obviamente debe eliminar sus declaraciones de depuración (o para proyectos más serios, probablemente debería usar un marco de registro y no usar p o put para la depuración). El hecho de quep
devuelva el objeto parece irrelevante en la mayoría de las situaciones (y creo que di esta respuesta antes de que este fuera el caso). La diferencia en la salida es la diferencia principal (y solía ser la única).También es importante tener en cuenta que
puts
"reacciona" a una clase que hato_s
definido,p
no lo hace. Por ejemplo:Esto se deduce directamente de la
.inspect
llamada, pero no es obvio en la práctica.fuente
p foo
es lo mismo queputs foo.inspect
fuente
puts
regresanil
, en lugar defoo
como lo hacep
.puts foo.inspect; foo
(-> {p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
. ¡Muchos votos positivos NO hacen que esta sea una buena respuesta!Además de las respuestas anteriores, hay una sutil diferencia en la salida de la consola, es decir, la presencia / ausencia de comillas / comillas invertidas, que puede ser útil:
Encuentro esto útil si desea hacer una barra de progreso simple, utilizando su pariente cercano, imprimir :
Esto da la barra de progreso del 100%:
Y esto agrega un * incremental en cada iteración:
fuente
De documento ruby-2.4.1
pone
probémoslo en irb
pags
en irb
fuente
Estos 2 son iguales:
( inspeccionar ofrece una vista más literal del objeto en comparación con el método to_s )
fuente
(->{p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
Esto puede ilustrar una de las diferencias clave, que es que
p
devuelve el valor de lo que se le pasa, donde seputs
devuelvenil
.Los programas de referencia
puts
son más lentosfuente