2013-03-08 3 views
21

में पीपी (या सांत्वना देने outputted कुछ भी) के परिणाम लाना हम जानते हैंएक स्ट्रिंग

require 'pp' 
a=["value1", "value2", "value3"] 
pp a 

सुंदर कंसोल के लिए एक आउटपुट के रूप में सरणी प्रिंट करता है। मैं उस सुंदर आउटपुट को एक स्ट्रिंग में कैसे प्राप्त करूं (एक स्ट्रिंग जिसमें नई लाइनें होती हैं जो चीज़ों को सुंदर बनाती है) आदि?

... उद्देश्य एक विधि से उस सुंदर स्ट्रिंग को वापस करने का उद्देश्य है।

+0

+1 अच्छा प्रश्न। –

+0

संभावित डुप्लिकेट [STDOUT के बजाय एक चर के लिए सुंदर प्रिंट कैसे करें?] (Http://stackoverflow.com/questions/14127375/how-to-pretty-print-to-a-variable-instead-of-stdout) – akostadinov

उत्तर

44
a.pretty_inspect 

#pretty_inspect भी साथ जब आप पहली बार 'पीपी' की आवश्यकता होती है आता है - देखें: http://ruby-doc.org/stdlib-2.1.0/libdoc/pp/rdoc/Kernel.html#method-i-pretty_inspect

आप संस्करण irb सांत्वना है कि है

a.inspect 

और नहीं करता है 'के लिए outputted है चाहते हैं टी आवश्यक है किसी भी आवश्यक है।

+1

+1। अच्छा और छोटा –

+0

प्रलेखन लिंक उलझन में है क्योंकि यह कहता है कि यह एक कर्नेल विधि है। – Martinos

+0

यह उपलब्ध है क्योंकि कर्नेल मॉड्यूल ऑब्जेक्ट क्लास द्वारा शामिल किया गया है .. – Martinos

1

आप एक स्ट्रिंग में उत्पादन सहेजना चाहते हैं, तो आप उपयोग कर सकते हैं stringio

यहाँ एक उदाहरण है:

#!/usr/bin/env ruby 

require 'stringio' 
require 'pp' 

def output_to_string 
    sio = StringIO.new 
    old_stdout, $stdout = $stdout, sio 
    yield 
    $stdout = old_stdout # restore stdout 
    sio.string 
end 

result = output_to_string do 
    puts "hello" 
    pp ["value1", "value2", "value3"] 
end 

puts "result: #{result}" 

आप इस कोड exec तो आपको मिलेगा:

result: hello 
["value1", "value2", "value3"] 
3

pp के आउटपुट को कैप्चर करने के लिए यह nice 'n simple तरीका है:

 
require 'pp' 

asdf = {'a' => 1, :b => 2, 'c' => %w[ho daddy]} 
foo = PP.pp(asdf, '') 
puts foo 
=> {"a"=>1, :b=>2, "c"=>["ho", "daddy"]} 

कैप्चर STDOUT, जो डिफ़ॉल्ट पर pp पिग्गीबैक तरह puts और print द्वारा और है कि चीजें इस्तेमाल किया चैनल, एक थोड़ा और अधिक जटिल है:

require 'pp' 
require 'stringio' 

asdf = {'a' => 1, :b => 2, 'c' => %w[ho daddy]} 
puts 'Writing to STDOUT...' 
pp asdf 

# remember the old STDOUT stream... 
old_stdout = $stdout 

# ...and create a new stream that writes to a string. 
captured_stdio = StringIO.new('', 'w') 
$stdout = captured_stdio 

# This is all captured... 
puts 'Capturing to buffer...' 
pp asdf 

# reset STDOUT 
$stdout = old_stdout 
puts 'Capturing off...' 

# show what we got... 
puts captured_stdio.string 

और क्या छपा था:

Writing to STDOUT... 
{"a"=>1, :b=>2, "c"=>["ho", "daddy"]} 
Capturing off... 
Capturing to buffer... 
{"a"=>1, :b=>2, "c"=>["ho", "daddy"]} 

उपरोक्त अंतिम दो पंक्तियों को captured_stdio में सामान्य $stdout चैनल के लिए प्रतिस्थापित करके संग्रहीत किया गया था। कुछ भी लिखा गया है (एसटीडीओयूटी क्या होगा) संग्रहित हो गया। मूल चैनल में वापस स्वैपिंग ने सामान्य प्रिंटिंग बहाल की, और captured_stdio पर लिखे जाने से कुछ और रोक दिया।