将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,它是putsprint使用的默认通道,以及像背负式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"]