Ruby 呈現資料之 print、puts、p 比較

印出資料是一般程式最基本的功能之一

 

c 有 printf

c++ 有 cout

c# 有 WriteLine

php 有 echo

perl 有 print

perl 6 還有 say

 

我自己的經驗指出,常用的指令,的確是愈短愈令人舒服,打的字少,無形中感覺輕鬆許多。

 

在學習 ruby 時,一開始要印出資料,我是用 print,這個命令應該有古老的傳統,和 c 的 printf 比起來,至少少了一個 f,這個 f 應該是 format 的意思,printf 對於格式處理有很強的能力。

 

後來發現 ruby 還有一個 puts,用起來更方便,不但字比較少,而且會自動換行,不像 print 每次都要印 "\n" 才會換行,自動換行的場合是更常見的。

 

後來又發現還有一個 p,它的主要功能是印出詳細的資訊,對於程式除錯很方便,但不適合用來呈現一般的資料。

 

例如

puts "hello"

會印出 hello 這串文字。

 

但若用

p "hello"

則會印出 "hello" 這串文字。它連引號都印出來了,讓人知道這是一個字串,但這通常不是我們需要的結果。

 

有了 print、puts、p 這三個工具,在呈現資料就很有彈性了。

 

有一次在同事討論中,提到這一篇文章也談到這三個指令

 

Ruby 印出值的方法 — print, puts 及p之比較

 

不過在它的表格中,紅圈的「是」似乎不太對,因為 print 並不會保留原始型態。

(2022/10/12 後記:該文已修正了 )

image

 

舉個例:

 

p /\d+/.match("123")

結果是

#<MatchData "123">

這就是原始形態。

 

再看

puts /\d+/.match("123")

結果是

123

這就不是原始形態了。

 

再看

print /\d+/.match("123")

結果是

123

這也不是原始形態。


 

再看表格中的例子,它是印出一個陣列。

 

使用 p 來印陣列

p [1, 2, 3]

結果是

[1, 2, 3]


 

使用 print 來印陣列

print [1, 2, 3]

結果也是

[1, 2, 3]


 

使用 puts 來印陣列

puts [1, 2, 3]

結果是印成三行

1
2
3

由這個例子來看,print 似乎又有印出原始形態?

 

後來 ray 查了 puts 的資料,他說:

 

被列印的物件如果是 array, 會印出 array 裡的每個元素跟著換行。

如果不是字串也不是 array, 那會呼叫物件的 to_s 來轉換。

所以,array 是個例外。

 

所以再試一下

puts [1, 2, 3].to_s

結果果然也是

[1, 2, 3]

 

所以這裡可以做一個結論,puts 和 print 一樣,都不會印出原始形態,只是呼叫物件的 to_s 方法,再印出其結果。

 

只有在列印陣列時,puts 是特例,puts 會逐行印出陣列中的資料。

 

我想上面那篇文章的作者,大概是剛好用了陣列的例子,所以誤以為 print 和 p 一樣會印出資料的原始形態。

 

重要度:
文章分類:
電腦標籤:

發表新回應

借我放一下廣告