Na verdade, uma nova linha após cada argumento. Esse é um ponto-chave e não está claro nos documentos do Ruby (já que o exemplo tem apenas 1 argumento).
cdunn2001
3
Há outra coisa ... estenda a classe da matriz e substitua o método to_s. se coloca não usar os novos to_s para um objeto de sua nova classe, enquanto print faz
kapv89
1
usar irb 0.9.5 puts ("a") e puts ("a \ n") têm exatamente a mesma saída no REPL.
Marcus Junius Brutus
@ kapv89 Isso não é verdade: eu apenas tentei e ambos os métodos de impressão usam o método to_s. Apenas p não usa.
collimarco
6
@Ronker, isso ainda é apenas um argumento. O compilador concatena seqüências de caracteres adjacentes.
cdunn2001
61
Uma grande diferença é se você estiver exibindo matrizes. Especialmente aqueles com NIL. Por exemplo:
print [nil,1,2]
dá
[nil,1,2]
mas
puts [nil,1,2]
dá
12
Observe que nenhum item nulo aparece (apenas uma linha em branco) e cada item em uma linha diferente.
Eu notei isso hoje, o que me trouxe aqui. Eu adoraria saber o que pensar sobre isso. Parece ser um caso especial de put para lidar com matrizes assim. Pensando em qual era a lógica ... É apenas para ser análogo a outras línguas?
Dan Barron
Faz sentido, uma vez que o put será exibido com uma nova linha, para que você possa pensar nele como iterando no array e chamando put em cada linha ... é estranho, no entanto, que ele não nil
exiba
42
printgera cada argumento, seguido por $,, para $stdout, seguido por $\. É equivalente aargs.join($,) + $\
putsdefine ambos $,e $\como "\ n" e, em seguida, faz o mesmo que print. A principal diferença é que cada argumento é uma nova linha puts.
Você pode require 'english'acessar essas variáveis globais com nomes fáceis de usar .
Grava o (s) objeto (s) fornecido (s) no ios . Retorna nil.
O fluxo deve ser aberto para gravação. Cada objeto que não é uma string será convertido chamando seu to_smétodo. Quando chamado sem argumentos, imprime o conteúdo de $_.
Se o separador do campo de saída ( $,) não for nil, ele será inserido entre os objetos. Se o separador de registros de saída ( $\) não estiver nil, ele será anexado à saída.
...
puts(obj, ...) → nil
Grava o (s) objeto (s) fornecido (s) no ios . Grava uma nova linha após qualquer que ainda não termine com uma sequência de nova linha. Retorna nil.
O fluxo deve ser aberto para gravação. Se chamado com um argumento de matriz, grava cada elemento em uma nova linha. Cada objeto que não é uma string ou matriz será convertido chamando seu to_smétodo. Se chamado sem argumentos, gera uma única nova linha.
Experimentando um pouco os pontos acima, as diferenças parecem ser:
Chamado com vários argumentos, os printsepara pelo 'separador de campo de saída' $,(que não é o padrão) e os putssepara por novas linhas. putstambém coloca uma nova linha após o argumento final, enquanto printnão.
putschame o to_sde cada argumento e adicione uma nova linha a cada string, se não terminar com a nova linha.
printbasta gerar cada argumento chamando de to_s.
por exemplo
puts "one two"::
one two
{nova linha}
puts "one two\n":
one two
{new line} #puts não adicionará uma nova linha ao resultado, pois a string termina com uma nova linha
print "one two":
one two
print "one two\n":
one two
{nova linha}
E há outra maneira de produzir: p
Para cada objeto, escreve diretamente obj.inspect seguido por uma nova linha na saída padrão do programa.
É útil gerar uma mensagem de depuração.
p "aa\n\t":aa\n\t
-1 por dois motivos. Em primeiro lugar, falta de clareza: não entendo o que o "Mas ..." inicial pretende seguir adiante, nem entendo a que o "sim" no parágrafo final está respondendo. Em segundo lugar, por falta de correção: você diz que usar no printflugar do putscódigo de exemplo dará o mesmo resultado, mas na verdade não. A putsvariante adiciona uma nova linha no final, enquanto a printfoutra não, exatamente como no caso em que não há matriz interpolada na cadeia. (Necessariamente assim, uma vez que a interpolação acontece quando se avalia o literal string.)
Mark Amery
Aha! Depois de ler outras respostas, acho que entendi - você pretendia que fosse uma resposta para stackoverflow.com/a/14534145/1709587 ? De qualquer forma, ele realmente não tem uma resposta por si só.
Respostas:
puts
adiciona uma nova linha ao final de cada argumento, se ainda não houver uma.print
não adiciona uma nova linha.Por exemplo:
puts [[1,2,3], [4,5,nil]]
Retornaria:Considerando
print [[1,2,3], [4,5,nil]]
que retornaria:fonte
Uma grande diferença é se você estiver exibindo matrizes. Especialmente aqueles com NIL. Por exemplo:
dá
mas
dá
Observe que nenhum item nulo aparece (apenas uma linha em branco) e cada item em uma linha diferente.
fonte
nil
print
gera cada argumento, seguido por$,
, para$stdout
, seguido por$\
. É equivalente aargs.join($,) + $\
puts
define ambos$,
e$\
como "\ n" e, em seguida, faz o mesmo queprint
. A principal diferença é que cada argumento é uma nova linhaputs
.Você pode
require 'english'
acessar essas variáveis globais com nomes fáceis de usar .fonte
english
libOs documentos da API dão algumas boas dicas:
Experimentando um pouco os pontos acima, as diferenças parecem ser:
Chamado com vários argumentos, os
print
separa pelo 'separador de campo de saída'$,
(que não é o padrão) e osputs
separa por novas linhas.puts
também coloca uma nova linha após o argumento final, enquantoprint
não.puts
descompacta automaticamente matrizes, enquantoprint
não:print
sem argumentos imprime$_
(a última coisa lida porgets
), enquantoputs
imprime uma nova linha:print
grava o separador de registros de saída$\
após o que imprimir, enquantoputs
ignora esta variável:fonte
puts
chame oto_s
de cada argumento e adicione uma nova linha a cada string, se não terminar com a nova linha.print
basta gerar cada argumento chamando deto_s
.por exemplo
puts "one two"
::one two
{nova linha}
puts "one two\n"
:one two
{new line} #puts não adicionará uma nova linha ao resultado, pois a string termina com uma nova linha
print "one two"
:one two
print "one two\n"
:one two
{nova linha}
E há outra maneira de produzir:
p
É útil gerar uma mensagem de depuração.
p "aa\n\t"
:aa\n\t
fonte
Se você deseja
puts
gerar uma matriz dentro da string usando , obterá o mesmo resultado como se estivesse usandoprint
:Mas se não estiver dentro de uma string citada, sim. A única diferença é entre a nova linha quando usamos
puts
.fonte
printf
lugar doputs
código de exemplo dará o mesmo resultado, mas na verdade não. Aputs
variante adiciona uma nova linha no final, enquanto aprintf
outra não, exatamente como no caso em que não há matriz interpolada na cadeia. (Necessariamente assim, uma vez que a interpolação acontece quando se avalia o literal string.)