web-dev-qa-db-fra.com

Quelle est la difference entre print et putting?

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 }
252
delete

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

print n'ajoute pas de nouvelle ligne.


Par exemple:

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

 1 
 2 
 3 
 4 
 5 

Considérant que print [[1,2,3], [4,5,nil]] renverrait:

[[1,2,3], [4,5, néant]]
Remarquez comment put ne fournit pas la valeur nulle alors que l’impression le permet.
363
mikewilliamson

Une grande différence réside dans le fait que vous affichez des tableaux. Surtout ceux avec NIL. Par exemple:

print [nil, 1, 2]

donne

[nil, 1, 2]

mais

puts [nil, 1, 2]

donne

1
2

Remarque: aucun élément néant n'apparaît (juste une ligne vierge) et chaque élément sur une ligne différente.

61
MBentley

print affiche chaque argument, suivi de $,, à $stdout, suivi de $\. C'est équivalent à args.join($,) + $\

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

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

41
wersimmon

Les docs de l'API donnent de bons conseils:

print() → nil

print(obj, ...) → nil

Ecrit le ou les objets donnés en ios . Retourne nil.

Le flux doit être ouvert pour l'écriture. Chaque objet donné qui n'est pas une chaîne sera converti en appelant sa méthode to_s. Appelé sans arguments, affiche le contenu de $_.

Si le séparateur de champ en sortie ($,) n'est pas nil, il est inséré entre les objets. Si le séparateur d'enregistrement de sortie ($\) n'est pas nil, il est ajouté à la sortie.

...

puts(obj, ...) → nil

Ecrit le ou les objets donnés en ios . Écrit une nouvelle ligne après toute autre qui ne se termine pas déjà par une séquence de nouvelle ligne. Retourne nil.

Le flux doit être ouvert pour l'écriture. Si appelé avec un argument de tableau, écrit chaque élément sur une nouvelle ligne. Chaque objet donné qui n'est ni une chaîne ni un tableau sera converti en appelant sa méthode to_s. Si appelé sans arguments, génère une nouvelle ligne.

En expérimentant 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 en sortie' $, (dont la valeur par défaut est néant), tandis que puts les sépare par des lignes nouvelles. 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:

    2.1.3: 001> imprimer [1, [2, 3]], [4]
     [1, [2, 3]] [4] => néant 
     2.1.3: 002> met [1, [2, 3]], [4]
     1 
     2 
     3 
     4 
     => Néant
  • print sans argument imprime $_ (la dernière chose lue par gets ), tandis que puts imprime une nouvelle ligne:

    2.1.3 :001 > getshello 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 en sortie $\ après quoi qu'il soit imprimé, alors 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
18
Mark Amery

puts appelle le to_s de chaque argument et ajoute une nouvelle ligne à chaque chaîne, si elle ne se termine pas par une nouvelle ligne. print affiche simplement chaque argument en appelant son 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 sortir: p

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

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

3
ryan