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 }
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.
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.
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.
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 leurto_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 queputs
les sépare par des sauts de ligne.puts
met également une nouvelle ligne après l'argument final, alors queprint
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 queprint
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 pargets
), alors queputs
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 queputs
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
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
Si vous utilisez 'print', une nouvelle ligne ne sera pas créée automatiquement. Avec 'puts', il crée automatiquement une nouvelle ligne.
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.
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".