Par exemple, dans cette ligne de code, j'ai écrit print
et puts
produit des résultats différents.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Par exemple, dans cette ligne de code, j'ai écrit print
et puts
produit des résultats différents.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Réponses:
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]]
Retournerais:
1 2 3 4 5
Alors print [[1,2,3], [4,5,nil]]
que reviendrait:
[[1,2,3], [4,5, nil]]
Remarquez comment le put ne produit pas la valeur nil alors que l'impression le fait.
Une grande différence est si 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 nul n'apparaissant (juste une ligne vierge) et chaque élément sur une ligne différente.
nil
print
renvoie chaque argument, suivi de $,
, à $stdout
, suivi de $\
. C'est équivalent àargs.join($,) + $\
puts
définit les deux $,
et $\
sur "\ n", puis fait la même chose que print
. La principale différence étant que chaque argument est une nouvelle ligne avec puts
.
Vous pouvez require 'english'
accéder à ces variables globales avec des noms conviviaux .
english
lib
Les documents de l'API donnent de bons conseils:
print() → nil
print(obj, ...) → nil
Écrit le ou les objets donnés dans ios . Retours
nil
.Le flux doit être ouvert pour l'écriture. Chaque objet donné qui n'est pas une chaîne sera converti en appelant sa
to_s
méthode. Lorsqu'il est appelé sans arguments, imprime le contenu de$_
.Si le séparateur de champ de sortie (
$,
) ne l'est pasnil
, il est inséré entre les objets. Si le séparateur d'enregistrement de sortie ($\
) ne l'est pasnil
, il est ajouté à la sortie....
puts(obj, ...) → nil
Écrit le ou les objets donnés dans ios . Écrit une nouvelle ligne après une séquence qui ne se termine pas déjà par une séquence de nouvelle ligne. Retours
nil
.Le flux doit être ouvert pour l'écriture. S'il est appelé avec un argument tableau, écrit chaque élément sur une nouvelle ligne. Chaque objet donné qui n'est pas une chaîne ou un tableau sera converti en appelant sa
to_s
méthode. S'il est appelé sans arguments, génère une seule nouvelle ligne.
En expérimentant un peu avec les points donnés ci-dessus, les différences semblent être:
Appelé avec plusieurs arguments, les print
sépare par le «séparateur de champ de sortie» $,
(qui ne vaut rien par défaut) tout en les puts
séparant par des retours à la ligne. puts
met également une nouvelle ligne après l'argument final, tandis print
que non.
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, print
sans:
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 arguments s'affiche $_
(la dernière chose lue par gets
), tandis que puts
imprime 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, tout en puts
ignorant 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
appeler 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
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 existe une autre façon de produire: p
Pour chaque objet, écrit directement obj.inspect suivi d'un retour à la sortie standard du programme.
Il est utile de générer un message de débogage.
p "aa\n\t"
:aa\n\t
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, oui. La seule différence est entre la nouvelle ligne lorsque nous l'utilisons puts
.
printf
au lieu de puts
dans votre exemple de code donnera le même résultat, mais en fait ce n'est pas le cas. La puts
variante ajoute une nouvelle ligne à la fin tandis que celle- printf
ci ne le fait pas, tout comme le cas où il n'y a pas de tableau interpolé dans la chaîne. (Forcément, puisque l'interpolation se produit lors de l'évaluation du littéral de chaîne.)