Por ejemplo, en esta línea de código escribí, print
y puts
produzco resultados diferentes.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Por ejemplo, en esta línea de código escribí, print
y puts
produzco resultados diferentes.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Respuestas:
puts
agrega una nueva línea al final de cada argumento si aún no hay una.
print
No agrega una nueva línea.
Por ejemplo:
puts [[1,2,3], [4,5,nil]]
Volvería:
1 2 3 4 4 5 5
Mientras print [[1,2,3], [4,5,nil]]
que volvería:
[[1,2,3], [4,5, nulo]]
Observe cómo put no genera el valor nulo, mientras que print sí.
Una gran diferencia es si está mostrando matrices. Especialmente los que tienen NIL. 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 nulo (solo una línea en blanco) y cada elemento en una línea diferente.
nil
print
genera cada argumento, seguido de $,
, a $stdout
, seguido de $\
. Es equivalente aargs.join($,) + $\
puts
establece ambos $,
y $\
"\ 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'
acceder a esas variables globales con nombres fáciles de usar .
english
lib
Los documentos API dan algunas buenas sugerencias:
print() → nil
print(obj, ...) → nil
Escribe los objetos dados en ios . Las devoluciones
nil
.La secuencia debe estar abierta para escritura. Cada objeto dado que no sea una cadena se convertirá llamando a su
to_s
método. Cuando se llama sin argumentos, imprime el contenido de$_
.Si el separador de campo de salida (
$,
) nonil
lo está, se inserta entre los objetos. Si el separador de registro de salida ($\
) nonil
lo está, se agrega a la salida....
puts(obj, ...) → nil
Escribe los objetos dados en ios . Escribe una nueva línea después de cualquiera que aún no termine con una secuencia de nueva línea. Las devoluciones
nil
.La secuencia debe estar abierta para escritura. Si se llama con un argumento de matriz, escribe cada elemento en una nueva línea. Cada objeto dado que no sea una cadena o matriz se convertirá llamando a su
to_s
método. Si se llama sin argumentos, genera una nueva línea nueva.
Experimentando un poco con los puntos dados anteriormente, las diferencias parecen ser:
Llamado con múltiples argumentos, los print
separa por el 'separador de campo de salida' $,
(que por defecto es nada) mientras los puts
separa por nuevas líneas. puts
también pone una nueva línea después del argumento final, mientras print
que no.
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 las matrices, mientras print
que no:
2.1.3: 001> imprimir [1, [2, 3]], [4] [1, [2, 3]] [4] => cero 2.1.3: 002> pone [1, [2, 3]], [4] 1 2 3 4 4 => nulo
print
sin argumentos imprime $_
(lo último leído gets
), mientras 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 registro de salida $\
después de lo que imprime, mientras 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
puts
llama al to_s
de cada argumento y agrega 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 agregará 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.inspect seguido de una nueva línea en la salida estándar del programa.
Es útil enviar un mensaje de depuración.
p "aa\n\t"
:aa\n\t
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 está dentro de una cadena citada, entonces sí. La única diferencia es entre una nueva línea cuando la usamos puts
.
printf
lugar de puts
en su código de ejemplo dará el mismo resultado, pero en realidad no lo hace. La puts
variante agrega una nueva línea al final, mientras que la printf
otra no, al igual que en el caso de que no haya una matriz interpolada en la cadena. (Necesariamente, ya que la interpolación ocurre al evaluar el literal de cadena).