Apa perbedaan antara hasil cetak dan hasil cetak?

Jawaban:

377

puts menambahkan baris baru ke akhir setiap argumen jika belum ada satu pun.

print tidak menambahkan baris baru.


Sebagai contoh:

puts [[1,2,3], [4,5,nil]] Akan kembali:

1
2
3
4
5

Sedangkan print [[1,2,3], [4,5,nil]] akan kembali:

[[1,2,3], [4,5, nihil]]
Perhatikan bagaimana menempatkan tidak menghasilkan nilai nol sedangkan cetak tidak.
mikewilliamson
sumber
88
Sebenarnya, baris baru setelah setiap argumen. Itu adalah poin kunci dan tidak jelas dari dokumen Ruby (karena contoh hanya memiliki 1 argumen).
cdunn2001
3
Ada hal lain ... perluas kelas array dan ganti metode to_s. put tidak menggunakan to_s baru untuk objek kelas baru Anda saat mencetak tidak
kapv89
1
menggunakan irb 0.9.5 put ("a") dan puts ("a \ n") memiliki output yang persis sama pada REPL.
Marcus Junius Brutus
@ kapv89 Itu tidak benar: Saya baru saja mencoba dan keduanya meletakkan cetak menggunakan metode to_s. Hanya p tidak menggunakannya.
collimarco
6
@Fronker, itu masih satu argumen. Kompiler menggabungkan string yang berdekatan.
cdunn2001
61

Perbedaan besar adalah jika Anda menampilkan array. Terutama yang dengan NIL. Sebagai contoh:

print [nil, 1, 2]

memberi

[nil, 1, 2]

tapi

puts [nil, 1, 2]

memberi

1
2

Catatan, tidak ada item nihil yang muncul (hanya baris kosong) dan setiap item pada baris yang berbeda.

MBentley
sumber
1
Saya perhatikan ini hari ini, yang membawa saya ke sini. Saya ingin tahu pemikiran tentang itu. Sepertinya kasus khusus untuk menangani array seperti itu. Ingin tahu apa alasannya ... Apakah itu hanya untuk dianalogikan dengan bahasa lain?
Dan Barron
Masuk akal karena put akan menampilkan dengan baris baru, sehingga Anda dapat menganggapnya sebagai iterasi pada array dan memanggil menempatkan pada setiap baris ... aneh, bagaimanapun, bahwa itu tidak menghasilkannil
Muers
42

printmenampilkan setiap argumen, diikuti oleh $,, untuk $stdout, diikuti oleh $\. Ini setara denganargs.join($,) + $\

putsset kedua $,dan $\ke "\ n" dan kemudian lakukan hal yang sama seperti print. Perbedaan utama adalah bahwa setiap argumen adalah baris baru puts.

Anda dapat require 'english'mengakses variabel global tersebut dengan nama yang mudah digunakan .

wersimmon
sumber
tip yang bagus pada englishlib
lacostenycoder
18

API API memberikan beberapa petunjuk bagus:

print() → nil

print(obj, ...) → nil

Menulis objek yang diberikan ke ios . Pengembalian nil.

Aliran harus dibuka untuk ditulis. Setiap objek yang diberikan bukan string akan dikonversi dengan memanggil to_smetodenya. Saat dipanggil tanpa argumen, cetak isi $_.

Jika pemisah bidang keluaran ( $,) tidak nil, ia dimasukkan di antara objek. Jika pemisah catatan output ( $\) tidak nil, itu ditambahkan ke output.

...

puts(obj, ...) → nil

Menulis objek yang diberikan ke ios . Menulis baris baru setelah yang belum berakhir dengan urutan baris baru. Pengembalian nil.

Aliran harus dibuka untuk ditulis. Jika dipanggil dengan argumen array, tulis setiap elemen pada baris baru. Setiap objek yang diberikan bukan string atau array akan dikonversi dengan memanggil to_smetodenya. Jika dipanggil tanpa argumen, menghasilkan satu baris baru.

Bereksperimen sedikit dengan poin-poin yang diberikan di atas, perbedaannya tampaknya:

  • Dipanggil dengan banyak argumen, printpisahkan dengan 'pemisah bidang keluaran' $,(yang defaultnya tidak ada), dan putspisahkan dengan baris baru. putsjuga menempatkan baris baru setelah argumen terakhir, sementara printtidak.

    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
  • putssecara otomatis membongkar array, sementara printtidak:

    2.1.3: 001> cetak [1, [2, 3]], [4]
    [1, [2, 3]] [4] => nihil 
    2.1.3: 002> menempatkan [1, [2, 3]], [4]
    1
    2
    3
    4
     => nihil
  • printtanpa cetakan argumen $_(hal terakhir dibaca oleh gets), saat putsmencetak baris baru:

    2.1.3 :001 > gets
    hello world
     => "hello world\n" 
    2.1.3 :002 > puts
    
     => nil 
    2.1.3 :003 > print
    hello world
     => nil
  • printmenulis pemisah catatan output $\setelah apa pun yang dicetak, sementara putsmengabaikan variabel ini:

    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
sumber
4

putspanggil to_ssetiap argumen dan tambahkan baris baru ke setiap string, jika tidak diakhiri dengan baris baru. printhanya output setiap argumen dengan memanggil mereka to_s.

misalnya puts "one two":: one two

{garis baru}

puts "one two\n": one two

{baris baru} #puts tidak akan menambahkan baris baru ke hasil, karena string diakhiri dengan baris baru

print "one two": one two

print "one two\n": one two

{garis baru}

Dan ada cara lain untuk menghasilkan: p

Untuk setiap objek, langsung tulis obj.inspect diikuti oleh baris baru ke output standar program.

Sangat membantu untuk menghasilkan pesan debug. p "aa\n\t":aa\n\t

ryan
sumber
-1

Jika Anda ingin menghasilkan array dalam string menggunakan puts, Anda akan mendapatkan hasil yang sama seperti jika Anda menggunakan print:

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

Tetapi jika tidak menggunakan string yang dikutip maka ya. Satu-satunya perbedaan adalah antara baris baru saat kami gunakan puts.

pengguna2273663
sumber
1
-1 karena dua alasan. Pertama, kurangnya kejelasan: Saya tidak mengerti apa yang awalnya "Tapi ..." di sini bermaksud untuk mengikuti dari ini, juga tidak saya mengerti apa yang "ya" dalam paragraf terakhir balas. Kedua, karena kurangnya kebenaran: Anda mengatakan bahwa menggunakan printfalih-alih putsdalam kode contoh Anda akan memberikan hasil yang sama, tetapi kenyataannya tidak. The putsvarian menambahkan baris baru di akhir sementara printfsatu tidak, seperti kasus di mana tidak ada array yang diinterpolasi ke dalam string. (Seharusnya begitu, karena interpolasi terjadi ketika mengevaluasi string literal.)
Mark Amery
Aha! Setelah membaca jawaban lain, saya pikir saya mengerti - Anda bermaksud ini sebagai balasan ke stackoverflow.com/a/14534145/1709587 ? Bagaimanapun, itu tidak benar-benar berdiri sendiri.
Mark Amery