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.
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.
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
-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.
Jawaban:
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:Sedangkan
print [[1,2,3], [4,5,nil]]
akan kembali:sumber
Perbedaan besar adalah jika Anda menampilkan array. Terutama yang dengan NIL. Sebagai contoh:
memberi
tapi
memberi
Catatan, tidak ada item nihil yang muncul (hanya baris kosong) dan setiap item pada baris yang berbeda.
sumber
nil
print
menampilkan setiap argumen, diikuti oleh$,
, untuk$stdout
, diikuti oleh$\
. Ini setara denganargs.join($,) + $\
puts
set kedua$,
dan$\
ke "\ n" dan kemudian lakukan hal yang sama sepertiprint
. Perbedaan utama adalah bahwa setiap argumen adalah baris baruputs
.Anda dapat
require 'english'
mengakses variabel global tersebut dengan nama yang mudah digunakan .sumber
english
libAPI API memberikan beberapa petunjuk bagus:
Bereksperimen sedikit dengan poin-poin yang diberikan di atas, perbedaannya tampaknya:
Dipanggil dengan banyak argumen,
print
pisahkan dengan 'pemisah bidang keluaran'$,
(yang defaultnya tidak ada), danputs
pisahkan dengan baris baru.puts
juga menempatkan baris baru setelah argumen terakhir, sementaraprint
tidak.puts
secara otomatis membongkar array, sementaraprint
tidak:print
tanpa cetakan argumen$_
(hal terakhir dibaca olehgets
), saatputs
mencetak baris baru:print
menulis pemisah catatan output$\
setelah apa pun yang dicetak, sementaraputs
mengabaikan variabel ini:sumber
puts
panggilto_s
setiap argumen dan tambahkan baris baru ke setiap string, jika tidak diakhiri dengan baris baru.print
hanya output setiap argumen dengan memanggil merekato_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
Sangat membantu untuk menghasilkan pesan debug.
p "aa\n\t"
:aa\n\t
sumber
Jika Anda ingin menghasilkan array dalam string menggunakan
puts
, Anda akan mendapatkan hasil yang sama seperti jika Anda menggunakanprint
:Tetapi jika tidak menggunakan string yang dikutip maka ya. Satu-satunya perbedaan adalah antara baris baru saat kami gunakan
puts
.sumber
printf
alih-alihputs
dalam kode contoh Anda akan memberikan hasil yang sama, tetapi kenyataannya tidak. Theputs
varian menambahkan baris baru di akhir sementaraprintf
satu tidak, seperti kasus di mana tidak ada array yang diinterpolasi ke dalam string. (Seharusnya begitu, karena interpolasi terjadi ketika mengevaluasi string literal.)