Outputting to a string

Discussion in 'Ruby' started by Albert Schlef, Mar 5, 2010.

  1. 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/.
    Albert Schlef, Mar 5, 2010
    #1
    1. Advertising

  2. Albert Schlef

    Robert Dober Guest

    On Fri, Mar 5, 2010 at 6:47 AM, Albert Schlef <> wrot=
    e:
    > 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.
    > --
    > 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=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
    Robert Dober, Mar 5, 2010
    #2
    1. Advertising

  3. On Fri, Mar 5, 2010 at 6:47 AM, Albert Schlef <> wrot=
    e:
    > 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.
    Jesús Gabriel y Galán, Mar 5, 2010
    #3
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jonathan
    Replies:
    4
    Views:
    1,092
    bruce barker
    Dec 15, 2004
  2. Replies:
    3
    Views:
    345
    Richard Herring
    Mar 2, 2006
  3. raashid bhatt
    Replies:
    4
    Views:
    298
  4. Replies:
    0
    Views:
    88
  5. Tom
    Replies:
    1
    Views:
    87
    McKirahan
    Nov 16, 2004
Loading...

Share This Page