¿Hay alguna diferencia entre py putsen Ruby?
270
p fooimprime foo.inspectseguido de una nueva línea, es decir, imprime el valor de en inspectlugar 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).
ptambién devuelve el valor del objeto, mientrasputsque no.1.9.3p125 :002 > (p "foo").class "foo" => String 1.9.3p125 :003 > (puts "foo").class foo => NilClassto_ses 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 quepdevuelva 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_sdefinido,pno lo hace. Por ejemplo:Esto se deduce directamente de la
.inspectllamada, pero no es obvio en la práctica.fuente
p fooes lo mismo queputs foo.inspectfuente
putsregresanil, en lugar defoocomo 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
pdevuelve el valor de lo que se le pasa, donde seputsdevuelvenil.Los programas de referencia
putsson más lentosfuente