Zum Beispiel habe ich in dieser Codezeile geschrieben print
und puts
unterschiedliche Ergebnisse erzielt.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Zum Beispiel habe ich in dieser Codezeile geschrieben print
und puts
unterschiedliche Ergebnisse erzielt.
1.upto(1000).each { |i| print i if i % 2 == 0 }
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:
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.
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.
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 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 .
english
lib
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_s
Methode konvertiert . Wenn ohne Argumente aufgerufen, wird der Inhalt von gedruckt$_
.Wenn das Ausgabefeldtrennzeichen (
$,
) nicht vorhanden istnil
, wird es zwischen Objekten eingefügt. Wenn das Trennzeichen für den Ausgabedatensatz ($\
) nicht vorhanden istnil
, 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_s
Methode 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 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ährend print
dies 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
puts
entpackt Arrays automatisch, während print
dies 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
print
ohne Argumente wird gedruckt $_
(das letzte, was von gelesen wird gets
), während puts
eine 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
print
schreibt das Trennzeichen für den Ausgabedatensatz $\
nach dem Drucken und puts
ignoriert 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
puts
Rufen Sie das to_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 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
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
.
printf
anstelle von puts
in Ihrem Beispielcode das gleiche Ergebnis liefert, dies jedoch nicht. Die puts
Variante fügt am Ende eine neue Zeile hinzu, während printf
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.)