Apakah ada perbedaan antara p
dan puts
di Ruby?
270
p foo
cetakan foo.inspect
diikuti oleh baris baru, yaitu mencetak nilai inspect
alih - alih to_s
, yang lebih cocok untuk debugging (karena Anda dapat misalnya membedakan antara 1
, "1"
dan "2\b1"
, yang Anda tidak dapat saat mencetak tanpa inspect
).
p
juga mengembalikan nilai objek, sementaraputs
tidak.1.9.3p125 :002 > (p "foo").class "foo" => String 1.9.3p125 :003 > (puts "foo").class foo => NilClass
to_s
adalah metode to-string standar di Ruby.inspect
. seperti yang saya katakan, adalah metode alternatif ke-string, yang menghasilkan output yang lebih cocok untuk debugging. Setelah menyelesaikan debugging Anda harus menghapus pernyataan debugging Anda (atau untuk proyek yang lebih serius Anda mungkin harus menggunakan kerangka kerja logging dan tidak menggunakan p atau menempatkan untuk debugging sama sekali). Fakta yangp
mengembalikan objek tampaknya tidak relevan dalam kebanyakan situasi (dan saya percaya saya memberikan jawaban ini sebelum ini terjadi). Perbedaan dalam output adalah perbedaan utama (dan dulunya satu-satunya).Penting juga untuk dicatat bahwa
puts
"bereaksi" ke kelas yang telahto_s
didefinisikan,p
tidak. Sebagai contoh:Ini mengikuti langsung dari
.inspect
panggilan, tetapi tidak jelas dalam praktiknya.sumber
p foo
sama denganputs foo.inspect
sumber
puts
kembalinil
, bukanfoo
seperti halnyap
.puts foo.inspect; foo
(-> {p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
. Banyak upvotes TIDAK membuat ini jawaban yang bagus!Selain jawaban di atas, ada perbedaan halus dalam output konsol - yaitu ada / tidak adanya tanda koma / tanda kutip - yang dapat berguna:
Saya menemukan ini berguna jika Anda ingin membuat progress bar sederhana, menggunakan kerabat dekatnya, cetak :
Ini memberikan bilah kemajuan 100%:
Dan ini menambahkan * inkremental pada setiap iterasi:
sumber
Dari dokumen ruby-2.4.1
menempatkan
ayo coba di irb
hal
di irb
sumber
Ini 2 adalah sama:
( inspect memberikan pandangan objek yang lebih literal dibandingkan dengan metode to_s )
sumber
(->{p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
Ini dapat menggambarkan salah satu perbedaan utama yaitu
p
mengembalikan nilai dari apa yang diteruskan ke sana, di mana sebagaiputs
pengembaliannil
.Pertunjukan benchmark
puts
lebih lambatsumber