Ad esempio, in questa riga di codice ho scritto print
e puts
produco risultati diversi.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Ad esempio, in questa riga di codice ho scritto print
e puts
produco risultati diversi.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Risposte:
puts
aggiunge una nuova riga alla fine di ogni argomento se non ce n'è già una.
print
non aggiunge una nuova riga.
Per esempio:
puts [[1,2,3], [4,5,nil]]
Ritornerebbe:
1 2 3 4 5
Considerando print [[1,2,3], [4,5,nil]]
che tornerebbe:
[[1,2,3], [4,5, zero]]
Notare come put non genera il valore zero mentre stampa lo fa.
Una grande differenza è se si stanno visualizzando array. Soprattutto quelli con NIL. Per esempio:
print [nil, 1, 2]
dà
[nil, 1, 2]
ma
puts [nil, 1, 2]
dà
1
2
Nota, nessun elemento zero visualizzato (solo una riga vuota) e ogni elemento su una riga diversa.
nil
print
genera ogni argomento, seguito da $,
, a $stdout
, seguito da $\
. È equivalente aargs.join($,) + $\
puts
imposta entrambi $,
e $\
su "\ n" e quindi fa la stessa cosa di print
. La differenza chiave è che ogni argomento è una nuova riga conputs
.
È possibile require 'english'
accedere a tali variabili globali con nomi intuitivi .
english
lib
I documenti API danno alcuni buoni suggerimenti:
print() → nil
print(obj, ...) → nil
Scrive gli oggetti dati su iOS . ritorna
nil
.Lo stream deve essere aperto per la scrittura. Ogni dato oggetto che non è una stringa verrà convertito chiamando il suo
to_s
metodo. Se chiamato senza argomenti, stampa il contenuto di$_
.Se il separatore del campo di output (
$,
) nonnil
lo è, viene inserito tra gli oggetti. Se il separatore del record di output ($\
) nonnil
lo è, viene aggiunto all'output....
puts(obj, ...) → nil
Scrive gli oggetti dati su iOS . Scrive una nuova riga dopo quella che non termina già con una sequenza di nuova riga. Ritorni
nil
.Lo stream deve essere aperto per la scrittura. Se chiamato con un argomento array, scrive ogni elemento su una nuova riga. Ogni dato oggetto che non è una stringa o un array verrà convertito chiamando il suo
to_s
metodo. Se chiamato senza argomenti, genera una nuova riga.
Sperimentando un po 'con i punti sopra indicati, le differenze sembrano essere:
Chiamato con più argomenti, print
li separa dal "separatore del campo di output" $,
(che per impostazione predefinita è nulla) mentre puts
li separa da newline. puts
mette anche una nuova riga dopo l'argomento finale, mentre print
non lo fa.
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
decomprime automaticamente gli array, mentre print
non:
2.1.3: 001> stampa [1, [2, 3]], [4] [1, [2, 3]] [4] => zero 2.1.3: 002> inserisce [1, [2, 3]], [4] 1 2 3 4 => zero
print
senza argomenti stampa $_
(l'ultima cosa letta da gets
), mentre puts
stampa una nuova riga:
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
scrive il separatore del record di output $\
dopo tutto ciò che stampa, mentre puts
ignora questa variabile:
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
chiama il to_s
di ogni argomento e aggiunge una nuova riga a ciascuna stringa, se non termina con una nuova riga.
print
emette semplicemente ogni argomento chiamando il loro to_s
.
ad esempio
puts "one two"
::
one two
{nuova linea}
puts "one two\n"
:
one two
{new line} #puts non aggiungerà una nuova riga al risultato, poiché la stringa termina con una nuova riga
print "one two"
:
one two
print "one two\n"
:
one two
{nuova linea}
E c'è un altro modo di produrre: p
Per ogni oggetto, scrive direttamente obj.inspect seguito da una nuova riga nell'output standard del programma.
È utile emettere un messaggio di debug.
p "aa\n\t"
:aa\n\t
Se si desidera eseguire l'output dell'array all'interno della stringa utilizzando puts
, si otterrà lo stesso risultato come se si stesse utilizzando print
:
puts "#{[0, 1, nil]}":
[0, 1, nil]
Ma se non con una stringa tra virgolette allora sì. L'unica differenza è tra la nuova linea quando usiamo puts
.
printf
invece del puts
tuo codice di esempio darà lo stesso risultato, ma in realtà non lo è. La puts
variante aggiunge una nuova riga alla fine mentre printf
quella no, proprio come nel caso in cui non vi sia alcun array interpolato nella stringa. (Necessariamente così, poiché l'interpolazione avviene quando si valuta il valore letterale della stringa.)