Por exemplo, nesta linha de código que escrevi printe putsproduza resultados diferentes.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Por exemplo, nesta linha de código que escrevi printe putsproduza 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
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 .
englishlib
Os documentos da API dão algumas boas dicas:
print() → nil
print(obj, ...) → nilGrava 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 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, ...) → nilGrava 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.
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
=> nilputsdescompacta automaticamente matrizes, enquanto printnã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
printsem argumentos imprime $_(a última coisa lida por gets), enquanto putsimprime 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
=> nilprintgrava o separador de registros de saída $\após o que imprimir, enquanto putsignora 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! => nilputschame 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
Se você deseja putsgerar 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.
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.)