Подтвердить что ты не робот

Помещение результатов pp (или чего-либо, выводимого на консоль) в строку

Мы знаем

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

pretty печатает массив как вывод на консоль. Как получить этот симпатичный вывод в строку (строка, содержащая символы новой строки, которые делают вещи красивыми и т.д.)?

... Цель состоит в том, чтобы вернуть эту симпатичную строку из метода.

4b9b3361

Ответ 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"]