Was ist der Unterschied zwischen Print und Puts?

Antworten:

376

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:

1
2
3
4
5

In print [[1,2,3], [4,5,nil]] der Erwägung, dass zurückkehren würde:

[[1,2,3], [4,5, nil]]
Beachten Sie, dass Puts den Nullwert nicht ausgeben, während Print dies tut.
Mikewilliamson
quelle
88
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

1
2

Beachten Sie, dass kein Null-Element (nur eine leere Zeile) und jedes Element in einer anderen Zeile angezeigt wird.

MBentley
quelle
1
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.

Sie können require 'english'auf diese globalen Variablen mit benutzerfreundlichen Namen zugreifen .

wersimmon
quelle
netter Tipp auf dem englishlib
lacostenycoder
18

Die API-Dokumente geben einige gute Hinweise:

print() → nil

print(obj, ...) → nil

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.

    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
  • putsentpackt Arrays automatisch, während printdies nicht der Fall ist:

    2.1.3: 001> print [1, [2, 3]], [4]
    [1, [2, 3]] [4] => Null 
    2.1.3: 002> setzt [1, [2, 3]], [4]
    1
    2
    3
    4
     => Null
  • printohne Argumente wird gedruckt $_(das letzte, was von gelesen wird gets), während putseine neue Zeile gedruckt wird:

    2.1.3 :001 > gets
    hello world
     => "hello world\n" 
    2.1.3 :002 > puts
    
     => nil 
    2.1.3 :003 > print
    hello world
     => nil
  • printschreibt das Trennzeichen für den Ausgabedatensatz $\nach dem Drucken und putsignoriert diese 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
Mark Amery
quelle
4

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

Ryan
quelle
-1

Wenn Sie ein Array innerhalb eines Strings mit ausgeben möchten puts, erhalten Sie dasselbe Ergebnis wie mit print:

puts "#{[0, 1, nil]}":
[0, 1, nil]

Aber wenn nicht mit einer Zeichenfolge in Anführungszeichen, dann ja. Der einzige Unterschied besteht zwischen neuen Zeilen, wenn wir verwenden puts.

user2273663
quelle
1
-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.
Mark Amery