Помещение результатов pp (или чего-либо, выводимого на консоль) в строку
Мы знаем
require 'pp'
a=["value1", "value2", "value3"]
pp a
pretty печатает массив как вывод на консоль. Как получить этот симпатичный вывод в строку (строка, содержащая символы новой строки, которые делают вещи красивыми и т.д.)?
... Цель состоит в том, чтобы вернуть эту симпатичную строку из метода.
Ответы
Ответ 1
a.pretty_inspect
#pretty_inspect
также появляется, когда вы сначала требуете "pp" - см.: http://ruby-doc.org/stdlib-2.1.0/libdoc/pp/rdoc/Kernel.html#method-i-pretty_inspect
Если вам нужна версия, которая выводится в консоль irb
, которая находится
a.inspect
и не требует каких-либо изменений.
Ответ 2
Это nice 'n simple способ захвата вывода 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"]}
Захват STDOUT, который является каналом по умолчанию, используемым puts
и print
, и что такие вещи, как pp
piggyback on, немного сложнее:
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
. Все, что написано (что было бы STDOUT), было сохранено. Перестановка назад в исходном канале восстановила нормальную печать и остановила что-нибудь еще от записи на captured_stdio
.
Ответ 3
Если вы хотите сохранить вывод в строке, вы можете использовать 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}"
Если вы выполните этот код, вы получите:
result: hello
["value1", "value2", "value3"]