Por exemplo, nesta linha de código que escrevi print
e puts
produza resultados diferentes.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Por exemplo, nesta linha de código que escrevi print
e puts
produza resultados diferentes.
1.upto(1000).each { |i| print i if i % 2 == 0 }
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:
1 2 3 4 5
Considerando print [[1,2,3], [4,5,nil]]
que retornaria:
[[1,2,3], [4,5, zero]]
Observe como o put não gera o valor nulo, ao contrário o print.
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á
1
2
Observe que nenhum item nulo aparece (apenas uma linha em branco) e cada item em uma linha diferente.
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 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 .
english
lib
Os documentos da API dão algumas boas dicas:
print() → nil
print(obj, ...) → nil
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_s
método. Quando chamado sem argumentos, imprime o conteúdo de$_
.Se o separador do campo de saída (
$,
) não fornil
, ele será inserido entre os objetos. Se o separador de registros de saída ($\
) não estivernil
, 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_s
mé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 print
separa pelo 'separador de campo de saída' $,
(que não é o padrão) e os puts
separa por novas linhas. puts
também coloca uma nova linha após o argumento final, enquanto print
não.
2.1.3 :001 > print 'hello', 'world'
helloworld => nil
2.1.3 :002 > puts 'hello', 'world'
hello
world
=> nil
2.1.3 :003 > $, = 'fanodd'
=> "fanodd"
2.1.3 :004 > print 'hello', 'world'
hellofanoddworld => nil
2.1.3 :005 > puts 'hello', 'world'
hello
world
=> nil
puts
descompacta automaticamente matrizes, enquanto print
não:
2.1.3: 001> print [1, [2, 3]], [4] [1, [2, 3]] [4] => nulo 2.1.3: 002> coloca [1, [2, 3]], [4] 1 2 3 4 => nulo
print
sem argumentos imprime $_
(a última coisa lida por gets
), enquanto puts
imprime uma nova linha:
2.1.3 :001 > gets
hello world
=> "hello world\n"
2.1.3 :002 > puts
=> nil
2.1.3 :003 > print
hello world
=> nil
print
grava o separador de registros de saída $\
após o que imprimir, enquanto puts
ignora esta variável:
mark@lunchbox:~$ irb
2.1.3 :001 > $\ = 'MOOOOOOO!'
=> "MOOOOOOO!"
2.1.3 :002 > puts "Oink! Baa! Cluck! "
Oink! Baa! Cluck!
=> nil
2.1.3 :003 > print "Oink! Baa! Cluck! "
Oink! Baa! Cluck! MOOOOOOO! => nil
puts
chame o to_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 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
Se você deseja puts
gerar uma matriz dentro da string usando , obterá o mesmo resultado como se estivesse usando print
:
puts "#{[0, 1, nil]}":
[0, 1, nil]
Mas se não estiver dentro de uma string citada, sim. A única diferença é entre a nova linha quando usamos puts
.
printf
lugar do puts
código de exemplo dará o mesmo resultado, mas na verdade não. A puts
variante adiciona uma nova linha no final, enquanto a printf
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.)