[ Ruby ] 想印東西?P 開頭 Methods 三兄弟

print method, puts method, p method 三者有什麼差別?!

Chao Wu
5 min readMay 18, 2019
這是我印照片的方法 ❤️

寫程式的時候,很常在終端機 (Command Line) 中使用 irb (interactive ruby) 印出資訊來查看結果。我最常使用的方法是 puts method 和 p method,但有時候用 puts method 會印不出東西,我就會換用 p method,其實這樣的狀況發生不少次就是我自己對這些常用方法處於一知半解的狀態,所以我想簡單的了解一下這些常用方法。

在查找文件的過程中也發現一個我沒有使用到的 print method,因此這篇將紀錄關於 print method, puts method, p method 分別是什麼?彼此的差別在哪裡?

什麼是 print method、puts method、p method

  • print method

會印出內容物、印出的東西為連續排列(視覺可讀性較差)、回傳值為 nil。

  • puts method

puts 是 print string 的簡寫、會印出內容物、方法帶有換行符號(印出的內容物會自動換行)、回傳值為 nil。

  • p method

會完整印出內容物的型態與結構、方法帶有換行符號(印出的內容物會自動換行)、回傳值為內容物完整的型態與結構。

print method vs puts method

print method vs puts method

在 001 > 中使用 print method,結果是將內容物印出並連續排列。

在 002 > 中使用 puts method,結果與 print method 一樣會將內容物印出,但差別在於 puts method 有換行符號,故是分行排列展示結果。

兩種方法使用後的 => 這一行都是回傳 nil,nil 在 Ruby 中表示一個絕對的空值。(=> 這行是在告訴我們最後敘述的執行結果)

puts method vs p method

puts method vs p method

在 007 > 中與 008 > 中可以看出 puts method 和 p method 都有換行符號,差別在於 => 這行是否有明確地回傳值。

puts method 會印出內容物,回傳值總是回傳 nil,而 p method 則是印出完整型態和結構外,還會回傳內容物的完整型態與結構。

對於「完整型態與結構」這句話還是???

我的想法是既然只印數字不清楚意思,那如果選擇有完整資料型態與結構的物件來印看看呢?因此我建立一個 Book 的 class(具特定資料型態的藍圖)並試著用兩種方法分別印看看,就對於這兩種方法的差別更有感了。

class Book
def initialize(book_name, amount)
@book_name = book_name
@amount = amount
end
end
book = Book.new("Learning Rails for yourself", 1)puts book # 預期結果為 Ruby 預設值(class Book 在記憶體中的位置)
p book # 預期結果除了 Ruby 預設值外,還要完整顯示內容物的型態與結構

可以先試著預期一下結果,再用 irb 查看結果是否如預期。

透過 class 了解 puts method 和 p method 的差別

在 008 > 中的結果只印出 Ruby 預設值(book 在記憶體中的位址),回傳值的部分是 nil。

在 009 > 中除了印出預設值外,還印出 book 完整的型態與結構,回傳值的部分是完整的型態與結構。

to_s method vs inspect method

為什麼 puts method 和 p method 會有這樣的差別?

我們可以透過物件導向程式語言 (OOP) 的特性來檢驗 puts method 和 p method 本身的特性。

class What_method_in  def to_s
"I include to_s method." # 覆寫原本 to_s method 回傳的內容
end
def inspect
"I include inspect method." # 覆寫原本 inspect method 回傳的內容
end
endputs What_method_in.new
p What_method_in.new

可以試著將這段 code 在 irb 中執行,看看印出的內容和回傳的結果。

可以發現一個有趣的地方,在 020 > 中印出的是 to_s method 的訊息,在 021 > 中印出的是 inspect method 的訊息,所以可以大膽的認為 puts method 有使用到 to_s method(以字串表示的方法,重新定義程式輸出的方式),而 p method 有使用到 inspect method(對象狀態表示的方法,可以想像為編寫程式並用以除錯的工具)。

結論

因此,如果需求是為了紀錄的話,就使用 puts method,如果是為了除錯 (debugging) 的話,就使用 p method。

--

--

Chao Wu

blog_stories = 4; ( blog_stories >= 10 ) ? ‘Congratulation! Level up!’ : ‘Keep fighting! Chao Wu!’