Ruby中的p和puts的使用區別淺析

NO IMAGE

p 和 puts 是 Ruby 中特別常用的方法,很多童鞋可能認為它們是差不多的,使用的時候也不加註意,但是仔細考究起來,它們是有明顯差別的。

先舉一個例子
複製程式碼 程式碼如下:
class Foo
    def inspect
      “foo from inspect”
    end

    def to_s
      “foo from to_s”
    end
  end

  foo = Foo.new
  p foo
  puts foo
  p “p: <#{foo}>”
  puts “p: <#{foo}>”

這段程式碼的輸出是
複製程式碼 程式碼如下:
foo from inspect
foo from to_s
p: <foo from to_s>
puts: <foo from to_s>

p obj 相當於 puts obj.inspect,而 puts obj 相當於 puts obj.to_s, 使用的方便是明顯區別的,p 是使用 obj 的 inspect 方法,而 puts 是 to_s 方法。

為什麼會這樣呢?這個我想可以從 to_s 和 inspect 的區別說起,to_s 是物件的字串表示, 是 puts 和雙引號字元使用的方法。inspect 是物件狀態的表示,通用用於 debug 中。 Object 中的定義了 to_s 和 inspect 方法,預設都是返回物件的類名和地址。

所以p 和 puts主要是用途的不同,p 是作為 debug 輸出,而 puts 作為物件的字串表示輸出。

另外值得一提的是,在 irb console 中,命令列中表示式求值,使用的是 p 物件的 inspect 方法。另外,通常 debug 輸出命令,也是使用物件的 inspect 方法。