Por ejemplo, en esta línea de código escribí, printy putsproduzco resultados diferentes.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Por ejemplo, en esta línea de código escribí, printy putsproduzco 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
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 .
englishlib
Los documentos API dan algunas buenas sugerencias:
print() → nil
print(obj, ...) → nilEscribe 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 (
$,) nonillo está, se inserta entre los objetos. Si el separador de registro de salida ($\) nonillo está, se agrega a la salida....
puts(obj, ...) → nilEscribe 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
=> nilputsdesempaqueta 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
=> nilprintescribe 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! => nilputsllama 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
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.
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).