Qual'è la differenza tra print e put?


Risposte:


377

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.

88
In realtà, una nuova riga dopo ogni argomento. Questo è un punto chiave e non è chiaro dai documenti di Ruby (poiché l'esempio ha solo 1 argomento).
cdunn2001,

3
C'è un'altra cosa ... estendere la classe array e sovrascrivere il metodo to_s. put non usa il nuovo to_s per un oggetto della tua nuova classe mentre la stampa lo fa
kapv89,

1
usando irb 0.9.5 put ("a") e put ("a \ n") hanno esattamente lo stesso output sul REPL.
Marco Junius Bruto

@ kapv89 Non è vero: ho appena provato ed entrambi mette e print usando il metodo to_s. Solo p non lo usa.
Collimarco,

6
@Fronker, questo è ancora solo un argomento. Il compilatore concatena le stringhe adiacenti.
cdunn2001,

61

Una grande differenza è se si stanno visualizzando array. Soprattutto quelli con NIL. Per esempio:

print [nil, 1, 2]

[nil, 1, 2]

ma

puts [nil, 1, 2]

1
2

Nota, nessun elemento zero visualizzato (solo una riga vuota) e ogni elemento su una riga diversa.


1
L'ho notato oggi, che mi ha portato qui. Mi piacerebbe sapere cosa ne pensi. Sembra un caso speciale per i put per gestire array del genere. Mi chiedo quale fosse la logica ... È solo per essere analogo ad altre lingue?
Dan Barron,

Ha senso poiché put emetterà un output con una nuova linea, quindi puoi pensarlo come iterazione sull'array e chiamare put su ogni riga ... è strano, tuttavia, che non venga emessonil
Muers,

42

printgenera ogni argomento, seguito da $,, a $stdout, seguito da $\. È equivalente aargs.join($,) + $\

putsimposta 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 .


bel suggerimento sulla englishlib
lacostenycoder

18

I documenti API danno alcuni buoni suggerimenti:

print() → nil

print(obj, ...) → nil

Scrive gli oggetti dati su iOS . ritornanil .

Lo stream deve essere aperto per la scrittura. Ogni dato oggetto che non è una stringa verrà convertito chiamando il suo to_smetodo. Se chiamato senza argomenti, stampa il contenuto di $_.

Se il separatore del campo di output ( $,) non nillo è, viene inserito tra gli oggetti. Se il separatore del record di output ( $\) non nillo è, 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_smetodo. Se chiamato senza argomenti, genera una nuova riga.

Sperimentando un po 'con i punti sopra indicati, le differenze sembrano essere:

  • Chiamato con più argomenti, printli separa dal "separatore del campo di output" $,(che per impostazione predefinita è nulla) mentre putsli separa da newline. putsmette anche una nuova riga dopo l'argomento finale, mentre printnon 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
  • putsdecomprime automaticamente gli array, mentre printnon:

    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
  • printsenza argomenti stampa $_(l'ultima cosa letta da gets), mentre putsstampa 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
  • printscrive il separatore del record di output $\dopo tutto ciò che stampa, mentre putsignora 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

4

putschiama il to_sdi ogni argomento e aggiunge una nuova riga a ciascuna stringa, se non termina con una nuova riga. printemette 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


-1

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.


1
-1 per due motivi. In primo luogo, una mancanza di chiarezza: non capisco a cosa si riferisca l'iniziale "Ma ..." qui, né capisco a cosa risponda il "sì" nell'ultimo paragrafo. In secondo luogo, per mancanza di correttezza: dici che usare printfinvece del putstuo codice di esempio darà lo stesso risultato, ma in realtà non lo è. La putsvariante aggiunge una nuova riga alla fine mentre printfquella 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.)
Mark Amery,

Aha! Dopo aver letto le altre risposte, penso di aver capito: intendevi che questa fosse una risposta a stackoverflow.com/a/14534145/1709587 ? In ogni caso, non ha davvero una risposta da sola.
Mark Amery,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.