En fait, une nouvelle ligne après chaque argument. C'est un point clé et pas clair dans les documents Ruby (puisque l'exemple n'a qu'un seul argument).
cdunn2001
3
Il y a autre chose ... étendez la classe du tableau et remplacez la méthode to_s. put n'utilise pas le nouveau to_s pour un objet de votre nouvelle classe alors que print le fait
kapv89
1
en utilisant irb 0.9.5 les put ("a") et les put ("a \ n") ont exactement la même sortie sur le REPL.
Marcus Junius Brutus
@ kapv89 Ce n'est pas vrai: je viens d'essayer et les deux met e print utiliser la méthode to_s. Seul p ne l'utilise pas.
collimarco
6
@Fronker, ce n'est encore qu'un argument. Le compilateur concatène les chaînes adjacentes.
cdunn2001
61
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
12
Remarque, aucun élément nul n'apparaissant (juste une ligne vierge) et chaque élément sur une ligne différente.
Je l'ai remarqué aujourd'hui, ce qui m'a amené ici. J'adorerais connaître la pensée à ce sujet. Cela semble être un cas spécial pour les put à gérer des tableaux comme ça. Vous vous demandez quelle était la justification ... Est-ce simplement pour être analogue à d'autres langues?
Dan Barron
Cela a du sens puisque les put sortiront avec une nouvelle ligne, vous pouvez donc le voir comme une itération sur le tableau et un appel aux put sur chaque ligne ... il est étrange, cependant, qu'il ne nil
sorte
42
printrenvoie chaque argument, suivi de $,, à $stdout, suivi de $\. C'est équivalent àargs.join($,) + $\
putsdé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 .
É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_sméthode. Lorsqu'il est appelé sans arguments, imprime le contenu de $_.
Si le séparateur de champ de sortie ( $,) ne l'est pas nil, il est inséré entre les objets. Si le séparateur d'enregistrement de sortie ( $\) ne l'est pas nil, 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_smé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 printsépare par le «séparateur de champ de sortie» $,(qui ne vaut rien par défaut) tout en les putsséparant par des retours à la ligne. putsmet également une nouvelle ligne après l'argument final, tandis printque non.
putsappeler le to_sde chaque argument et ajoute une nouvelle ligne à chaque chaîne, si elle ne se termine pas par une nouvelle ligne.
printil 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
-1 pour deux raisons. Premièrement, un manque de clarté: je ne comprends pas à quoi le "Mais ..." initial veut que cela suive, ni à quoi répond le "oui" du dernier paragraphe. Deuxièmement, pour un manque de justesse: vous dites que l'utilisation printfau lieu de putsdans votre exemple de code donnera le même résultat, mais en fait ce n'est pas le cas. La putsvariante ajoute une nouvelle ligne à la fin tandis que celle- printfci 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.)
Mark Amery
Ah! Après avoir lu d'autres réponses, je pense que je comprends - vous vouliez que ce soit une réponse à stackoverflow.com/a/14534145/1709587 ? En tout cas, il ne résiste pas vraiment à lui tout seul.
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:Alors
print [[1,2,3], [4,5,nil]]
que reviendrait:la source
Une grande différence est si vous affichez des tableaux. Surtout ceux avec NIL. Par exemple:
donne
mais
donne
Remarque, aucun élément nul n'apparaissant (juste une ligne vierge) et chaque élément sur une ligne différente.
la source
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 queprint
. La principale différence étant que chaque argument est une nouvelle ligne avecputs
.Vous pouvez
require 'english'
accéder à ces variables globales avec des noms conviviaux .la source
english
libLes documents de l'API donnent de bons conseils:
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 lesputs
séparant par des retours à la ligne.puts
met également une nouvelle ligne après l'argument final, tandisprint
que non.puts
décompresse automatiquement les tableaux,print
sans:print
sans arguments s'affiche$_
(la dernière chose lue pargets
), tandis queputs
imprime une nouvelle ligne:print
écrit le séparateur d'enregistrement de sortie$\
après tout ce qu'il imprime, tout enputs
ignorant cette variable:la source
puts
appeler leto_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 leurto_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
Il est utile de générer un message de débogage.
p "aa\n\t"
:aa\n\t
la source
Si vous souhaitez sortir un tableau dans une chaîne en utilisant
puts
, vous obtiendrez le même résultat que si vous utilisiezprint
: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
.la source
printf
au lieu deputs
dans votre exemple de code donnera le même résultat, mais en fait ce n'est pas le cas. Laputs
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.)