Existe alguma diferença entre p
e puts
no Ruby?
270
p foo
imprime foo.inspect
seguido por uma nova linha, ou seja, imprime o valor de em inspect
vez de to_s
, o que é mais adequado para depuração (porque você pode, por exemplo, diferenciar entre 1
, "1"
e "2\b1"
, o que não pode ao imprimir sem inspect
).
p
também retorna o valor do objeto, enquantoputs
não retorna .1.9.3p125 :002 > (p "foo").class "foo" => String 1.9.3p125 :003 > (puts "foo").class foo => NilClass
to_s
é o método padrão de string em Ruby.inspect
. como eu disse, é um método alternativo para string, que produz uma saída mais adequada para depuração. Após a conclusão da depuração, você obviamente deve remover suas instruções de depuração (ou, para projetos mais sérios, você provavelmente deve usar uma estrutura de log e não usar p ou puts para depuração). O fato dep
retornar o objeto parece irrelevante na maioria das situações (e acredito que dei essa resposta antes que isso acontecesse). A diferença na saída é a principal diferença (e costumava ser a única).Também é importante notar que
puts
"reage" a uma classe queto_s
definiu,p
não. Por exemplo:Isso segue diretamente da
.inspect
chamada, mas na prática não é óbvio.fonte
p foo
é o mesmo queputs foo.inspect
fonte
puts
retornanil
, em vez defoo
como fazp
.puts foo.inspect; foo
(-> {p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
. Muitos upvotes NÃO fazem disso uma boa resposta!Além das respostas acima, há uma diferença sutil na saída do console - a presença / ausência de vírgulas / aspas invertidas - que pode ser útil:
Acho isso útil se você quiser fazer uma barra de progresso simples, usando o parente próximo deles, print :
Isso fornece a barra de progresso de 100%:
E isso adiciona um * incremental em cada iteração:
fonte
De documento ruby-2.4.1
coloca
vamos tentar no irb
p
no irb
fonte
Estes 2 são iguais:
( inspecionar fornece uma visão mais literal do objeto em comparação com o método to_s )
fonte
(->{p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
Isso pode ilustrar uma das principais diferenças, que é que
p
retorna o valor do que é passado para ele, onde éputs
retornadonil
.O benchmark mostra que
puts
é mais lentofonte