2013-03-08 18 views
21

Chúng ta biếtĐưa các kết quả của trang (hoặc bất cứ điều gì để an ủi outputted) thành một chuỗi

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

khá in các mảng như một đầu ra để giao diện điều khiển. Làm cách nào để có được kết quả đầu ra đẹp đó thành một chuỗi (một chuỗi chứa các dòng mới làm cho mọi thứ đẹp đẽ, v.v.)?

... nhằm mục đích trả lại chuỗi xinh đẹp đó từ một phương pháp.

+0

+1 Câu hỏi hay. –

+0

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

Trả lời

44
a.pretty_inspect 

#pretty_inspect cũng đi kèm theo khi bạn lần đầu tiên require 'tr' - Xem: http://ruby-doc.org/stdlib-2.1.0/libdoc/pp/rdoc/Kernel.html#method-i-pretty_inspect

Nếu bạn muốn phiên bản được xuất ra các irb console đó là

a.inspect 

và doesn' t có bất kỳ yêu cầu cần thiết.

+1

+1. Đẹp và ngắn. –

+0

Liên kết tài liệu gây nhầm lẫn vì nó nói rằng đó là phương pháp Kernel. – Martinos

+0

Có sẵn vì mô-đun hạt nhân được bao gồm bởi lớp Đối tượng .. – Martinos

1

Nếu bạn muốn lưu kết quả vào một chuỗi, bạn có thể sử dụng stringio

Dưới đây là một ví dụ:

#!/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}" 

Nếu bạn exec mã này bạn sẽ có được:

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

Đâ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 putsprint 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.

Các vấn đề liên quan