Outputting to a string

I have a function that generates some textual data that I capture into a
string:

def gen_data(output, …)

output << “… some data …”

end

s = ‘’
gen_data(s, …)

I was wondering if instead it’s possible to use a pattern similar to the
following:

def gen_data(…)

puts “… some data …”

end

s = capture_output do
gen_data(…)
end

That’s because I want to pass gen_data() as few arguments as possible
(to make the code look “clean”. But also because my current code already
uses ‘puts’. And also because I encountered this need several times in
the past and I’m curious.)

I notice that this last pattern has a problem: if some debugging code
uses ‘puts’ too, the output will be ruined. So I’m interested to hears
about similar patterns and not necessarily the faulty one I devised
here.

On Fri, Mar 5, 2010 at 6:47 AM, Albert S. [email protected]
wrote:

gen_data(s, …)
s = capture_output do
about similar patterns and not necessarily the faulty one I devised
here.

Posted via http://www.ruby-forum.com/.

very ugly, but I am sure you can c?lean it up
require ‘stringio’

def gen_data; puts “42, I believe” end

def with_stdout &blk
s=StringIO::new
o=$stdout
$stdout=s
blk[]
s.string
ensure
$stdout=o
end

HTH
R

On Fri, Mar 5, 2010 at 6:47 AM, Albert S. [email protected]
wrote:

gen_data(s, …)
I’d just have gen_data return the string and let the caller make the
append to the string. What you have looks like an output argument and
that’s what the return value of the method should be used for, if
possible:

def gen_data

output = “…some data…”

output
end

s = “”
s << gen_data

I suppose there’s a way to redirect where puts writes into a String as
Robert has shown, but that could have some problems, as you stated: if
some other code inside uses puts, it will get appended to the string.
So, if that is exactly your use case (redirect all stdout to a string
for a method call) that could work. But I’d refactor the method, if
all you want to do is to return a string to the caller.

Jesus.