Eigentlich ein Zeilenumbruch nach jedem Argument. Dies ist ein wichtiger Punkt und aus den Ruby-Dokumenten nicht ersichtlich (da das Beispiel nur 1 Argument enthält).
cdunn2001
3
Es gibt noch eine andere Sache ... erweitern Sie die Array-Klasse und überschreiben Sie die to_s-Methode. Puts verwendet die neuen to_s nicht für ein Objekt Ihrer neuen Klasse, während print dies tut
kapv89
1
Mit irb 0.9.5 haben Puts ("a") und Puts ("a \ n") genau die gleiche Ausgabe auf der REPL.
Marcus Junius Brutus
@ kapv89 Das stimmt nicht: Ich habe es gerade versucht und beide Puts verwenden die to_s-Methode. Nur p benutzt es nicht.
Collimarco
6
@Fronker, das ist immer noch nur ein Argument. Der Compiler verkettet benachbarte Zeichenfolgen.
cdunn2001
61
Ein großer Unterschied besteht darin, ob Sie Arrays anzeigen. Besonders diejenigen mit NIL. Beispielsweise:
print [nil,1,2]
gibt
[nil,1,2]
aber
puts [nil,1,2]
gibt
12
Beachten Sie, dass kein Null-Element (nur eine leere Zeile) und jedes Element in einer anderen Zeile angezeigt wird.
Ich habe das heute bemerkt, was mich hierher gebracht hat. Ich würde gerne wissen, wie ich darüber nachdenke. Es scheint ein Sonderfall für Puts zu sein, um solche Arrays zu handhaben. Ich frage mich, was das Grundprinzip war ... Soll es nur analog zu anderen Sprachen sein?
Dan Barron
Es ist sinnvoll, da Puts mit einer neuen Zeile ausgegeben werden. Sie können sich also nil
vorstellen
42
printgibt jedes Argument aus, gefolgt von $,, bis $stdout, gefolgt von $\. Es ist äquivalent zuargs.join($,) + $\
putssetzt beide $,und $\auf "\ n" und macht dann dasselbe wie print. Der Hauptunterschied besteht darin, dass jedes Argument eine neue Zeile mit ist puts.
Schreibt die angegebenen Objekte in ios . Rückgabe nil.
Der Stream muss zum Schreiben geöffnet werden. Jedes Objekt, das keine Zeichenfolge ist, wird durch Aufrufen seiner to_sMethode konvertiert . Wenn ohne Argumente aufgerufen, wird der Inhalt von gedruckt $_.
Wenn das Ausgabefeldtrennzeichen ( $,) nicht vorhanden ist nil, wird es zwischen Objekten eingefügt. Wenn das Trennzeichen für den Ausgabedatensatz ( $\) nicht vorhanden ist nil, wird es an die Ausgabe angehängt.
...
puts(obj, ...) → nil
Schreibt die angegebenen Objekte in ios . Schreibt eine neue Zeile nach einer, die noch nicht mit einer neuen Zeile endet. Rückgabe nil.
Der Stream muss zum Schreiben geöffnet werden. Wenn mit einem Array-Argument aufgerufen, wird jedes Element in eine neue Zeile geschrieben. Jedes Objekt, das keine Zeichenfolge oder kein Array ist, wird durch Aufrufen seiner to_sMethode konvertiert . Wenn ohne Argumente aufgerufen, wird eine einzelne neue Zeile ausgegeben.
Wenn man ein wenig mit den oben angegebenen Punkten experimentiert, scheinen die Unterschiede zu sein:
Wird mit mehreren Argumenten aufgerufen printund durch das 'Ausgabefeldtrennzeichen' $,(standardmäßig nichts) putsgetrennt, während sie durch Zeilenumbrüche getrennt werden. putssetzt auch eine neue Zeile nach dem letzten Argument, während printdies nicht der Fall ist.
putsRufen Sie das to_svon jedem Argument auf und fügen Sie jeder Zeichenfolge eine neue Zeile hinzu, wenn sie nicht mit einer neuen Zeile endet.
printGeben Sie einfach jedes Argument aus, indem Sie ihre aufrufen to_s.
zum Beispiel
puts "one two"::
one two
{Neue Zeile}
puts "one two\n"::
one two
{neue Zeile} #puts fügt dem Ergebnis keine neue Zeile hinzu, da die Zeichenfolge mit einer neuen Zeile endet
print "one two"::
one two
print "one two\n"::
one two
{Neue Zeile}
Und es gibt noch einen anderen Weg zur Ausgabe: p
Schreibt für jedes Objekt direkt obj.inspect, gefolgt von einer neuen Zeile in die Standardausgabe des Programms.
Es ist hilfreich, eine Debugging-Nachricht auszugeben.
p "aa\n\t"::aa\n\t
-1 aus zwei Gründen. Erstens ein Mangel an Klarheit: Ich verstehe nicht, woraus das anfängliche "Aber ..." hier folgen soll, und ich verstehe auch nicht, worauf das "Ja" im letzten Absatz antwortet. Zweitens aus Mangel an Korrektheit: Sie sagen, dass die Verwendung printfanstelle von putsin Ihrem Beispielcode das gleiche Ergebnis liefert, dies jedoch nicht. Die putsVariante fügt am Ende eine neue Zeile hinzu, während printfdies nicht der Fall ist, genau wie in dem Fall, in dem kein Array in die Zeichenfolge interpoliert ist. (Notwendigerweise, da die Interpolation bei der Auswertung des String-Literal erfolgt.)
Mark Amery
Aha! Nachdem ich andere Antworten gelesen habe, glaube ich zu verstehen - Sie wollten, dass dies eine Antwort auf stackoverflow.com/a/14534145/1709587 ist ? Auf jeden Fall ist es keine Antwort für sich.
Antworten:
puts
Fügt am Ende jedes Arguments eine neue Zeile hinzu, falls noch keine vorhanden ist.print
fügt keine neue Zeile hinzu.Beispielsweise:
puts [[1,2,3], [4,5,nil]]
Würden zurückkehren:In
print [[1,2,3], [4,5,nil]]
der Erwägung, dass zurückkehren würde:quelle
Ein großer Unterschied besteht darin, ob Sie Arrays anzeigen. Besonders diejenigen mit NIL. Beispielsweise:
gibt
aber
gibt
Beachten Sie, dass kein Null-Element (nur eine leere Zeile) und jedes Element in einer anderen Zeile angezeigt wird.
quelle
nil
print
gibt jedes Argument aus, gefolgt von$,
, bis$stdout
, gefolgt von$\
. Es ist äquivalent zuargs.join($,) + $\
puts
setzt beide$,
und$\
auf "\ n" und macht dann dasselbe wieprint
. Der Hauptunterschied besteht darin, dass jedes Argument eine neue Zeile mit istputs
.Sie können
require 'english'
auf diese globalen Variablen mit benutzerfreundlichen Namen zugreifen .quelle
english
libDie API-Dokumente geben einige gute Hinweise:
Wenn man ein wenig mit den oben angegebenen Punkten experimentiert, scheinen die Unterschiede zu sein:
Wird mit mehreren Argumenten aufgerufen
print
und durch das 'Ausgabefeldtrennzeichen'$,
(standardmäßig nichts)puts
getrennt, während sie durch Zeilenumbrüche getrennt werden.puts
setzt auch eine neue Zeile nach dem letzten Argument, währendprint
dies nicht der Fall ist.puts
entpackt Arrays automatisch, währendprint
dies nicht der Fall ist:print
ohne Argumente wird gedruckt$_
(das letzte, was von gelesen wirdgets
), währendputs
eine neue Zeile gedruckt wird:print
schreibt das Trennzeichen für den Ausgabedatensatz$\
nach dem Drucken undputs
ignoriert diese Variable:quelle
puts
Rufen Sie dasto_s
von jedem Argument auf und fügen Sie jeder Zeichenfolge eine neue Zeile hinzu, wenn sie nicht mit einer neuen Zeile endet.print
Geben Sie einfach jedes Argument aus, indem Sie ihre aufrufento_s
.zum Beispiel
puts "one two"
::one two
{Neue Zeile}
puts "one two\n"
::one two
{neue Zeile} #puts fügt dem Ergebnis keine neue Zeile hinzu, da die Zeichenfolge mit einer neuen Zeile endet
print "one two"
::one two
print "one two\n"
::one two
{Neue Zeile}
Und es gibt noch einen anderen Weg zur Ausgabe:
p
Es ist hilfreich, eine Debugging-Nachricht auszugeben.
p "aa\n\t"
::aa\n\t
quelle
Wenn Sie ein Array innerhalb eines Strings mit ausgeben möchten
puts
, erhalten Sie dasselbe Ergebnis wie mitprint
:Aber wenn nicht mit einer Zeichenfolge in Anführungszeichen, dann ja. Der einzige Unterschied besteht zwischen neuen Zeilen, wenn wir verwenden
puts
.quelle
printf
anstelle vonputs
in Ihrem Beispielcode das gleiche Ergebnis liefert, dies jedoch nicht. Dieputs
Variante fügt am Ende eine neue Zeile hinzu, währendprintf
dies nicht der Fall ist, genau wie in dem Fall, in dem kein Array in die Zeichenfolge interpoliert ist. (Notwendigerweise, da die Interpolation bei der Auswertung des String-Literal erfolgt.)