2009-11-18 20 views
43

मुझे यकीन है कि यह उन लोगों के लिए एक मूर्ख सवाल है जो जानते हैं, लेकिन मुझे यह नहीं पता कि यह क्या करता है या यह क्या है।रुबी में "पी" क्या है?

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

"p row" क्या करता है?

उत्तर

77

p() एक कर्नेल विधि

यह मानक आउटपुट में obj.inspect लिखते है।

क्योंकि ऑब्जेक्ट कर्नेल मॉड्यूल में मिश्रित होता है, p() विधि हर जगह उपलब्ध है।

यह सामान्य है, बीटीडब्ल्यू, कविता मोड में इसका उपयोग करने के लिए, जिसका अर्थ है कि माता-पिता गिराए गए हैं। सीएसवी स्निपेट की तरह लिखा जा सकता है ...

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

यह here with the rest of the Kernel मॉड्यूल दस्तावेज है।

+1

+1 को लिंक जोड़ने के लिए +1 – edwardsmatt

+1

पी के लिए दस्तावेज़ों में सीधा लिंक - http://www.ruby-doc.org/core-1.8.7/Kernel.html#method-i-p – Joe

5

क्यों कोशिश नहीं करें?

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

वास्तव में यह कहता है '# अपने तर्क को inspect' पहले, लेकिन करीब पर्याप्त;) – hrnt

+0

यह सच है। मेरी 'उपनाम' टिप्पणी हटा दी गई है क्योंकि यह सिर्फ सादा गलत है। शायद 'रैपर' की तरह अधिक। – rfunduk

22

Kernel#pKernel#puts के छोटे डिबगिंग भाई है: यह कम या ज्यादा काम करता है वास्तव में यह पसंद है, लेकिन यह #to_s के बजाय #inspect का उपयोग कर अपने तर्कों बदल देता है।

इसका एक गुप्त रहस्य क्यों है इसका कारण यह है कि आप इसे तुरंत अभिव्यक्ति में फेंक सकते हैं और डीबगिंग करते समय इसे फिर से निकाल सकते हैं। (मुझे लगता है कि यह बहुत कम उपयोगी है कि अब रूबी बेहतर और बेहतर "उचित" डिबगिंग समर्थन मिल रहा है।)

Kernel#p करने के लिए कुछ विकल्प हैं Kernel#pppp मानक पुस्तकालय और Kernel#y (YAML) से (सुंदर प्रिंट) yaml से मानक पुस्तकालय

2

आपके सिस्टम पर पहले से मौजूद दस्तावेज़ों के लिए दूसरा विकल्प ri कमांड है। किसी भी समय आप टाइप कर सकते हैं: ri p या यदि p को केंद्रीय आदेशों के लिए कई स्थानों (जो यह है) में परिभाषित किया गया है तो आप ri Kernel.p आज़मा सकते हैं। अन्य अच्छे दांव Array.<whatever method> या String.<whatever method> हैं।

यदि आप रत्नों का एक समूह स्थापित करना समाप्त करते हैं तो यह बहुत धीमा हो जाएगा लेकिन आप फास्ट्री मणि देख सकते हैं जो लुकअप प्रक्रिया को अविश्वसनीय रूप से गति देता है।

1

कर्नेल # पी प्रिंट और रखरखाव से कम ज्ञात है।

यह कहता है कि यह एक नई लाइन जोड़ता है, लेकिन to_s को कॉल करने के बजाय, पी कॉल का निरीक्षण करता है।

संदर्भ

http://garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-ruby/

0

पी और पुट के बीच अंतर समझने के लिए, आप() उदाहरण to_s के बीच का अंतर और() पद्धतियों को समझना चाहिए।

to_s का उपयोग ऑब्जेक्ट की स्ट्रिंग प्रस्तुति प्राप्त करने के लिए किया जाता है जबकि instance टू_एस का एक और डेवलपर अनुकूल संस्करण है जो ऑब्जेक्ट्स की सामग्री भी देता है।

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"> 
संबंधित मुद्दे