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 Schlef <albertschlef@gmail.com> wrote:
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.
--
Posted via http://www.ruby-forum.com/\.
--
Learning without thought is labor lost; thought without learning is perilous.”
--- Confucius
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.
···
On Fri, Mar 5, 2010 at 6:47 AM, Albert Schlef <albertschlef@gmail.com> wrote:
I have a function that generates some textual data that I capture into a
string:
def gen_data(output, ...)
...
output << "... some data ..."
...
end