印出資料是一般程式最基本的功能之一
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 後記:該文已修正了 )
舉個例:
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 一樣會印出資料的原始形態。
- 瀏覽次數:726
發表新回應