¿Cuál es la diferencia entre print y pone?


Respuestas:


377

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í.

88
En realidad, una nueva línea después de cada argumento. Ese es un punto clave y no está claro en los documentos de Ruby (ya que el ejemplo tiene solo 1 argumento).
cdunn2001

3
Hay otra cosa ... extender la clase de matriz y anular el método to_s. put no utiliza los nuevos to_s para un objeto de su nueva clase, mientras que print lo hace
kapv89

1
El uso de irb 0.9.5 pone ("a") y pone ("a \ n") tiene exactamente la misma salida en el REPL.
Marcus Junius Brutus

@ kapv89 Eso no es cierto: acabo de intentarlo y ambos pones e print usan el método to_s. Solo p no lo usa.
collimarco

66
@Fronker, ese es solo un argumento. El compilador concatena cadenas adyacentes.
cdunn2001

61

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.


1
Me di cuenta de esto hoy, lo que me trajo aquí. Me encantaría saber lo que piensas sobre eso. Parece un caso especial para los puestos que manejan matrices como esa. Preguntándome cuál era la razón ... ¿Es solo ser análogo a otros idiomas?
Dan Barron

Tiene sentido, ya que los put se generarán con una nueva línea, por lo que puede pensar que itera en la matriz y llama a los put en cada línea ... Sin embargo, es extraño que no se nil
genere

42

printgenera cada argumento, seguido de $,, a $stdout, seguido de $\. Es equivalente aargs.join($,) + $\

putsestablece 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 .


buen consejo sobre la englishlib
lacostenycoder

18

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_smétodo. Cuando se llama sin argumentos, imprime el contenido de $_.

Si el separador de campo de salida ( $,) no nillo está, se inserta entre los objetos. Si el separador de registro de salida ( $\) no nillo 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_smé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 printsepara por el 'separador de campo de salida' $,(que por defecto es nada) mientras los putssepara por nuevas líneas. putstambién pone una nueva línea después del argumento final, mientras printque 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
  • putsdesempaqueta automáticamente las matrices, mientras printque 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
  • printsin argumentos imprime $_(lo último leído gets), mientras putsimprime 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
  • printescribe el separador de registro de salida $\después de lo que imprime, mientras putsignora 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

4

putsllama al to_sde cada argumento y agrega una nueva línea a cada cadena, si no termina con una nueva línea. printsimplemente 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


-1

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.


1
-1 por dos razones. En primer lugar, falta de claridad: no entiendo a qué se destina el "Pero ..." inicial para que esto siga, ni entiendo a qué responde el "sí" en el párrafo final. En segundo lugar, por falta de corrección: usted dice que usar en printflugar de putsen su código de ejemplo dará el mismo resultado, pero en realidad no lo hace. La putsvariante agrega una nueva línea al final, mientras que la printfotra 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).
Mark Amery

¡Ajá! Después de leer otras respuestas, creo que entiendo: ¿pretendía que esto fuera una respuesta a stackoverflow.com/a/14534145/1709587 ? En cualquier caso, realmente no tiene una respuesta por sí solo.
Mark Amery el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.