Đây là cách nice 'n simple để ghi lại kết quả của pp
:
require 'pp'
asdf = {'a' => 1, :b => 2, 'c' => %w[ho daddy]}
foo = PP.pp(asdf, '')
puts foo
=> {"a"=>1, :b=>2, "c"=>["ho", "daddy"]}
chụp STDOUT, mà là kênh mặc định được sử dụng bởi puts
và print
và rằng những thứ như pp
cõng trên, là phức tạp hơn một chút:
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
Và những gì đã in:
Writing to STDOUT...
{"a"=>1, :b=>2, "c"=>["ho", "daddy"]}
Capturing off...
Capturing to buffer...
{"a"=>1, :b=>2, "c"=>["ho", "daddy"]}
Hai dòng cuối cùng ở trên được lưu trữ trong captured_stdio
bằng cách thay thế cho kênh $stdout
thông thường. Mọi thứ được ghi vào (những gì sẽ là STDOUT) được lưu trữ. Hoán đổi lại kênh gốc đã khôi phục in bình thường và dừng bất kỳ thứ gì khác được ghi vào captured_stdio
.
Nguồn
2013-03-08 01:53:11
+1 Câu hỏi hay. –
Bản sao có thể có của [Cách in đẹp đến một biến thay vì STDOUT?] (Http://stackoverflow.com/questions/14127375/how-to-pretty-print-to-a-variable-instead-of-stdout) – akostadinov