2009-11-18 141 views
43

我敢肯定這對那些知道這些的人來說是一個愚蠢的問題,但我無法找到它對它做什麼或它是什麼的解釋。Ruby中的「p」是什麼?

CSV.open('data.csv', 'r') do |row| 
    p row 
end 

p row」是做什麼用的?

回答

77
p()

是一個內核方法

它寫入obj.inspect到標準輸出。

因爲對象在內核模塊中混合,所以在任何地方都可以使用p()方法。

這是常見的,順便說一句,在詩歌模式使用它,這意味着parens被丟棄。該CSV片段可以寫成像...

CSV.open 'data.csv', 'r' do |row| 
    p row 
end 

它記錄在here with the rest of the Kernel模塊。

+1

+1添加鏈接到文檔 – edwardsmatt 2011-08-08 23:10:34

+1

直接鏈接到文檔的p - http://www.ruby-doc.org/core-1.8.7/Kernel.html#method-i-p – Joe 2014-01-14 15:34:28

5

爲什麼不嘗試呢?

>> [1,2,3].each { |d| p d } 
1 
2 
3 
+3

其實它調用'#inspect'其說法第一,但接近 不夠;) – hrnt 2009-11-18 19:07:40

+0

真。刪除了我的'別名'評論,因爲它顯然是錯誤的。也許更像'包裝'。 – rfunduk 2009-11-18 19:22:34

22

Kernel#pKernel#puts小哥調試:或多或少的作品完全一樣,但它使用#inspect代替#to_s轉換它的參數。

它之所以有如此神祕的名字,是因爲您可以快速將其放入表達式中,並在調試時將其重新取出。 (我想這是少了很多有用的,現在紅寶石越來越好「正確的」調試支持。)

一些替代Kernel#pKernel#ppyamlpp標準庫和Kernel#y(YAML)(代碼)標準庫。

2

您系統上已有的文檔的另一選項是ri命令。在任何時候你可以輸入:ri p或者如果p被定義在很多地方(它是)中央命令,你可以試試ri Kernel.p。其他好的投注是Array.<whatever method>String.<whatever method>

如果您最終安裝了一堆寶石,這會減慢很多,但您可以查找加速查找過程的fastri gem,令人難以置信。

0

瞭解p和看跌期權的區別,你必須瞭解to_s()和實例的區別()方法。

to_s用於獲取對象的字符串表示,而instance是to_s的更開發友好的版本,它也提供了對象的內容。

class Dog 
     def initialize(name, breed) 
      @name = name 
      @breed = breed 
     end 
     def to_s 
      puts "#@name's breed is #@breed." 
     end 
end 

terra=Dog.new("Terra","Husky") 
puts terra #Terra's breed is Husky. 
p terra #<Dog:0x00007fbde0932a88 @name="Terra", @breed="Husky">