Outputting to a string

A

Albert Schlef

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.
 
R

Robert Dober

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

=A0def gen_data(output, ...)
=A0 =A0...
=A0 =A0output << "... some data ..."
=A0 =A0...
=A0end

=A0s =3D ''
=A0gen_data(s, ...)

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

=A0def gen_data(...)
=A0 =A0...
=A0 =A0puts "... some data ..."
=A0 =A0...
=A0end

=A0s =3D capture_output do
=A0 =A0gen_data(...)
=A0end

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.

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=3DStringIO::new
o=3D$stdout
$stdout=3Ds
blk[]
s.string
ensure
$stdout=3Do
end

HTH
R
--=20
Learning without thought is labor lost; thought without learning is perilou=
s.=94
--- Confucius
 
J

Jesús Gabriel y Galán

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

=A0def gen_data(output, ...)
=A0 =A0...
=A0 =A0output << "... some data ..."
=A0 =A0...
=A0end

=A0s =3D ''
=A0gen_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 =3D "...some data..."
...
output
end

s =3D ""
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top