¿Cuál es la diferencia entre imprimir y poner?


Por ejemplo, en esta línea de código que escribí, print y puts producen resultados diferentes.

1.upto(1000).each { |i| print i if i % 2 == 0 }
 229
Author: Mark Amery, 2011-02-16

8 answers

puts agrega una nueva línea al final de cada argumento si no hay uno ya.

print no añade una nueva línea.


Por ejemplo:

puts [[1,2,3], [4,5,nil]] volvería:

1
2
3
4
5

Considerando que print [[1,2,3], [4,5,nil]] volvería:

[[1,2,3], [4,5,nil]]
Observe cómo puts no genera el valor nil mientras que print lo hace.
 334
Author: mikewilliamson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-14 06:37:08

Una gran diferencia es si está mostrando matrices. Especialmente los que no tienen nada. Por ejemplo:

print [nil, 1, 2]

Da

[nil, 1, 2]

Pero

puts [nil, 1, 2]

Da

1
2

Tenga en cuenta que no aparece ningún elemento nil (solo una línea en blanco) y cada elemento en una línea diferente.

 60
Author: MBentley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-03 14:35:51

print muestra cada argumento, seguido de $,, a $stdout, seguido de $\. Es equivalente a args.join($,) + $\

puts establece $, y $\ a "\n" y luego hace lo mismo que print. La diferencia clave es que cada argumento es una nueva línea con puts.

Puede require 'english' para acceder a esas variables globales con nombres descriptivos.

 39
Author: wersimmon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-20 00:12:37

Los documentos de API dan algunos buenos consejos:

print() → nil

print(obj, ...) → nil

Escribe los objetos dados a ios. La transmisión debe estar abierta para la escritura. Si el separador de campo de salida ($,) no es nil, se insertará entre cada objeto. Si el separador de registros de salida ($\) no es nil, se agregará a la salida. Si no se dan argumentos, imprime $_. Los objetos que no son cadenas se convertirán llamando a su to_s método. Sin argumento, imprime el contenido de la variable $_. Devuelve nil.

...

puts(obj, ...) → nil

Escribe los objetos dados en ios como con IO#print. Escribe un separador de registros (típicamente una nueva línea) después de cualquiera que no termine ya con una secuencia de nueva línea. Si se llama con un argumento de matriz, escribe cada elemento en una nueva línea. Si se llama sin argumentos, muestra un solo separador de registros.

Experimentando un poco con los puntos dados arriba, las diferencias parecen ser:

  • Llamado con múltiples argumentos, print los separa por el 'separador de campo de salida' $, (que por defecto es nada) mientras que puts los separa por líneas nuevas. puts también pone una nueva línea después del argumento final, mientras que print no lo hace.

    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 desempaqueta automáticamente los arrays, mientras que print no:

    2.1.3 :001 > print [1, [2, 3]], [4]
    [1, [2, 3]][4] => nil 
    2.1.3 :002 > puts [1, [2, 3]], [4]
    1
    2
    3
    4
     => nil
  • print sin argumentos imprime $_ (la última cosa que leer gets), mientras que puts imprime una nueva línea:

    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 escribe el separador de registros de salida $\ después de lo que imprime, mientras que puts ignora esta variable:

    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
 16
Author: Mark Amery,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-09 21:06:15

puts llame al to_s de cada argumento y agregue una nueva línea a cada cadena, si no termina con una nueva línea. print simplemente genera cada argumento llamando a su to_s.

Por ejemplo: puts "one two": one two

{nueva línea}

puts "one two\n": one two

{nueva línea} # puts no añadirá una nueva línea al resultado, ya que la cadena termina con una nueva línea

print "one two": one two

print "one two\n": one two

{nueva línea}

Y hay otra forma de salida: p

Para cada objeto, escribe directamente obj.inspeccionar seguido de una nueva línea a la salida estándar del programa.

Es útil generar un mensaje de depuración. p "aa\n\t": aa\n\t

 3
Author: ryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-26 06:03:09

Si usa 'print' no creará una nueva línea automáticamente. Con 'puts' crea una nueva línea automáticamente.

 2
Author: Matthew Maurice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-29 04:27:30

El comando print simplemente toma lo que le das y lo imprime en la pantalla. puts (para "poner cadena") es ligeramente diferente: agrega una nueva línea (en blanco) después de lo que desea imprimir.

 1
Author: agooran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-04 05:16:09

Pero...

Si desea generar una matriz dentro de una cadena usando "puts", obtendrá el mismo resultado que si estuviera usando "print":

puts "#{[0, 1, nil]}":
[0, 1, nil]

Pero si no hay una cadena entrecomillada entonces sí. La única diferencia es entre la nueva línea cuando usamos "puts".

 0
Author: user2273663,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-04 12:57:04