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:
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: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
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 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
english
libLos documentos API dan algunas buenas sugerencias:
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 losputs
separa por nuevas líneas.puts
también pone una nueva línea después del argumento final, mientrasprint
que no.puts
desempaqueta automáticamente las matrices, mientrasprint
que no:print
sin argumentos imprime$_
(lo último leídogets
), mientrasputs
imprime una nueva línea:print
escribe el separador de registro de salida$\
después de lo que imprime, mientrasputs
ignora esta variable:fuente
puts
llama alto_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 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 two
print "one two\n"
:one two
{nueva línea}
Y hay otra forma de salida:
p
Es útil enviar un mensaje de depuración.
p "aa\n\t"
:aa\n\t
fuente
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
printf
lugar deputs
en su código de ejemplo dará el mismo resultado, pero en realidad no lo hace. Laputs
variante agrega una nueva línea al final, mientras que laprintf
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).