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
12
Tenga en cuenta que no aparece ningún elemento nulo (solo una línea en blanco) y cada elemento en una línea diferente.
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.
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.
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 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.
Respuestas:
putsagrega una nueva línea al final de cada argumento si aún no hay una.printNo agrega una nueva línea.Por ejemplo:
puts [[1,2,3], [4,5,nil]]Volvería:Mientras
print [[1,2,3], [4,5,nil]]que volvería:fuente
Una gran diferencia es si está mostrando matrices. Especialmente los que tienen NIL. Por ejemplo:
da
pero
da
Tenga en cuenta que no aparece ningún elemento nulo (solo una línea en blanco) y cada elemento en una línea diferente.
fuente
nilprintgenera cada argumento, seguido de$,, a$stdout, seguido de$\. Es equivalente aargs.join($,) + $\putsestablece ambos$,y$\"\ n" y luego hace lo mismo queprint. La diferencia clave es que cada argumento es una nueva línea conputs.Puede
require 'english'acceder a esas variables globales con nombres fáciles de usar .fuente
englishlibLos documentos API dan algunas buenas sugerencias:
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 losputssepara por nuevas líneas.putstambién pone una nueva línea después del argumento final, mientrasprintque no.putsdesempaqueta automáticamente las matrices, mientrasprintque no:printsin argumentos imprime$_(lo último leídogets), mientrasputsimprime una nueva línea:printescribe el separador de registro de salida$\después de lo que imprime, mientrasputsignora esta variable:fuente
putsllama alto_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 suto_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 twoprint "one two\n":one two{nueva línea}
Y hay otra forma de salida:
pEs útil enviar un mensaje de depuración.
p "aa\n\t":aa\n\tfuente
Si desea generar una matriz dentro de una cadena usando
puts, obtendrá el mismo resultado que si estuviera usandoprint:Pero si no está dentro de una cadena citada, entonces sí. La única diferencia es entre una nueva línea cuando la usamos
puts.fuente
printflugar deputsen su código de ejemplo dará el mismo resultado, pero en realidad no lo hace. Laputsvariante agrega una nueva línea al final, mientras que laprintfotra 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).