将pp(或输出到控制台的任何内容)的结果放入字符串中
我们知道
require 'pp' a=["value1", "value2", "value3"] pp a
pretty将数组打印为控制台的输出。 如何将这个漂亮的输出变成一个字符串(一个包含让事情变得漂亮的新行的字符串等)?
…目的是从方法中返回那个漂亮的字符串。
string_value = a.pretty_inspect
当你第一次要求’pp’时, #pretty_inspect
也会出现 – 请参阅: http : #pretty_inspect
如果你想要输出到irb
控制台的版本是
string_value = a.inspect
并没有任何必要的要求。
这是捕获pp
输出的一种简单方法:
要求'pp' asdf = {'a'=> 1,:b => 2,'c'=>%w [ho daddy]} foo = PP.pp(asdf,'') 放foo => {“a”=> 1,:b => 2,“c”=> [“ho”,“爸爸”]}
捕获STDOUT,它是puts
和print
使用的默认通道,以及像背负式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"]}
上面的最后两行通过将其替换为普通的$stdout
通道存储在captured_stdio
。 写入的任何东西(什么是STDOUT)都被存储了。 在原始通道中交换恢复正常打印,并阻止其他任何内容写入captured_stdio
。
如果要将输出保存为字符串,可以使用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"]