Quelle est la différence entre l'impression et la met?

Par exemple, dans cette ligne de code que j'ai écrite, print et puts produisent des résultats différents.

1.upto(1000).each { |i| print i if i % 2 == 0 }
229
demandé sur Mark Amery 2011-02-16 18:53:14

8 réponses

puts ajoute une nouvelle ligne à la fin de chaque argument s'il n'y en a pas déjà.

print n'ajoute pas de nouvelle ligne.


Par exemple:

puts [[1,2,3], [4,5,nil]] retournerait:

1
2
3
4
5

Considérant ce qui suit print [[1,2,3], [4,5,nil]] serait de retour:

[[1,2,3], [4,5,nil]]
Notez comment puts ne génère pas la valeur nil alors que print le fait.
334
répondu mikewilliamson 2017-11-14 06:37:08

Une grande différence est si vous affichez des tableaux. Surtout ceux avec zéro. Par exemple:

print [nil, 1, 2]

Donne

[nil, 1, 2]

Mais

puts [nil, 1, 2]

Donne

1
2

Remarque, n'apparaissant nulle élément (juste une ligne vide) et chaque élément sur une ligne différente.

60
répondu MBentley 2013-06-03 14:35:51

print les sorties de chaque argument, suivie par $,, à $stdout, puis $\. Il est équivalent à args.join($,) + $\

puts définit à la fois $, et $\ à "\n", puis fait la même chose que print. La différence essentielle étant que chaque argument est une nouvelle ligne avec puts.

Vous pouvez require 'english' pour accéder à ces variables globales avec noms conviviaux.

39
répondu wersimmon 2013-07-20 00:12:37

Les documents API donnent quelques bons conseils:

print() → nil

print(obj, ...) → nil

Écrit le(s) objet (S) donné (s) dans ios. Le flux doit être ouvert pour l'écriture. Si le séparateur de champ de sortie ($,) n'est pas nul, il sera inséré entre chaque objet. Si le séparateur d'enregistrement de sortie ($\) n'est pas nul, il sera ajouté à la sortie. Si aucun argument n'est donné, imprime $_. Les objets qui ne sont pas des chaînes seront convertis en appelant leur to_s méthode. Sans argument, affiche le contenu de la variable $_. Renvoie nil.

...

puts(obj, ...) → nil

Écrit les objets donnés dans ios comme avec IO#print. Écrit un séparateur d'enregistrement (généralement un retour à la ligne) après tout ce qui ne se termine pas déjà par une séquence de retour à la ligne. S'il est appelé avec un argument de Tableau, écrit chaque élément sur une nouvelle ligne. S'il est appelé sans arguments, affiche un seul séparateur d'enregistrement.

Expérimenter un peu avec les points donnés ci-dessus, les différences semblent être:

  • Appelé avec plusieurs arguments, print les sépare par le 'séparateur de champ de sortie' $, (qui par défaut est nothing) tandis que puts les sépare par des sauts de ligne. puts met également une nouvelle ligne après l'argument final, alors que print ne le fait pas.

    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 décompresse automatiquement les tableaux, alors que print ne le fait pas:

    2.1.3 :001 > print [1, [2, 3]], [4]
    [1, [2, 3]][4] => nil 
    2.1.3 :002 > puts [1, [2, 3]], [4]
    1
    2
    3
    4
     => nil
  • print sans arguments imprime $_ (la dernière chose que lire par gets), alors que puts affiche une nouvelle ligne:

    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 écrit le séparateur d'enregistrement de sortie $\ après tout ce qu'il imprime, tandis que puts ignore cette 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
16
répondu Mark Amery 2014-10-09 21:06:15

puts appel de la to_s de chaque argument et ajoute une nouvelle ligne à chaque chaîne, si elle ne se termine pas avec la nouvelle ligne. print Il suffit de sortir chaque argument en appelant leur to_s.

Par exemple: puts "one two": one two

{nouvelle ligne}

puts "one two\n": one two

{ nouvelle ligne} #puts n'ajoutera pas de nouvelle ligne au résultat, car la chaîne se termine par une nouvelle ligne

print "one two": one two

print "one two\n": one two

{nouvelle ligne}

Et il y a un autre moyen de sortie: p

Pour chaque objet, écrit directement obj.inspect suivi d'une nouvelle ligne vers la sortie standard du programme.

Il est utile de sortir un message de débogage. p "aa\n\t": aa\n\t

3
répondu ryan 2014-12-26 06:03:09

Si vous utilisez 'print', une nouvelle ligne ne sera pas créée automatiquement. Avec 'puts', il crée automatiquement une nouvelle ligne.

2
répondu Matthew Maurice 2016-11-29 04:27:30

La commande print prend tout ce que vous lui donnez et l'imprime à l'écran. puts (pour "put string") est légèrement différent: il ajoute une nouvelle ligne (vide) après la chose que vous voulez imprimer.

1
répondu agooran 2014-02-04 05:16:09

Mais...

Si vous souhaitez sortir un tableau dans une chaîne en utilisant "puts", vous obtiendrez le même résultat que si vous utilisiez "print":

puts "#{[0, 1, nil]}":
[0, 1, nil]

Mais si ce n'est pas avec une chaîne entre guillemets alors oui. La seule différence est entre nouvelle ligne lorsque nous utilisons "puts".

0
répondu user2273663 2014-09-04 12:57:04