proc to block

Discussion in 'Ruby' started by L A, Jan 8, 2008.

  1. L A

    L A Guest

    [Note: parts of this message were removed to make it a legal post.]

    Hello all,

    Is there a way to turn a Proc into a block for the purposes of methods that yield to blocks? It's not a necessity as I can always wrap the Proc in a block, I'm just curious.

    Thanks,
    Loren




    ____________________________________________________________________________________
    Never miss a thing. Make Yahoo your home page.
    http://www.yahoo.com/r/hs
    L A, Jan 8, 2008
    #1
    1. Advertising

  2. L A

    Gary Wright Guest

    On Jan 7, 2008, at 11:06 PM, L A wrote:

    > Hello all,
    >
    > Is there a way to turn a Proc into a block for the purposes of
    > methods that yield to blocks? It's not a necessity as I can always
    > wrap the Proc in a block, I'm just curious.


    Just prefix the object you want to be passed as a block with '&' in
    the argument list.

    p = proc { |x| x > 10 }

    [1,5,10,20, 30].select &p


    Gary Wright
    Gary Wright, Jan 8, 2008
    #2
    1. Advertising

  3. L A

    botp Guest

    On Jan 8, 2008 12:06 PM, L A <> wrote:
    > Is there a way to turn a Proc into a block for the purposes of methods that yield to blocks? It's not a necessity as I can always wrap the Proc in a block, I'm just curious.


    maybe use the & op, like

    p=proc{"hi, i'm proc"}
    #=> #<Proc:0x028cc40c@(irb):1>
    p.call
    #=> "hi, i'm proc"
    def q
    yield
    end
    #=> nil
    q
    LocalJumpError: no block given
    from (irb):7:in `q'
    from (irb):9
    from :0
    q &p
    #=> "hi, i'm proc"
    (proc &p).call
    #=> "hi, i'm proc"

    i am not sure why you want to wrap a proc with a block though

    proc {p}
    #=> #<Proc:0x02898418@(irb):30>
    (proc {p}).call
    #=> #<Proc:0x028cc40c@(irb):1>
    (proc {p}).call.call
    #=> "hi, i'm proc"

    kind regards -botp
    botp, Jan 8, 2008
    #3
  4. On Jan 7, 2008 11:35 PM, Gary Wright <> wrote:
    >
    > On Jan 7, 2008, at 11:06 PM, L A wrote:
    >
    > > Hello all,
    > >
    > > Is there a way to turn a Proc into a block for the purposes of
    > > methods that yield to blocks? It's not a necessity as I can always
    > > wrap the Proc in a block, I'm just curious.

    >
    > Just prefix the object you want to be passed as a block with '&' in
    > the argument list.
    >
    > p = proc { |x| x > 10 }
    >
    > [1,5,10,20, 30].select &p


    Except that this isn't part of the standard ruby library for 1.8. It
    relies on having a Symbol#to_proc method

    It is a common extension, for example Rails includes it.

    It IS part of Ruby 1.9 though.

    I'd suggest googling for "ruby to_proc"


    --
    Rick DeNatale

    My blog on Ruby
    http://talklikeaduck.denhaven2.com/
    Rick DeNatale, Jan 8, 2008
    #4
  5. On Jan 8, 8:24 am, Rick DeNatale <> wrote:
    > On Jan 7, 2008 11:35 PM, Gary Wright <> wrote:
    >
    >
    >
    > > On Jan 7, 2008, at 11:06 PM, L A wrote:

    >
    > > > Hello all,

    >
    > > > Is there a way to turn a Proc into a block for the purposes of
    > > > methods that yield to blocks? It's not a necessity as I can always
    > > > wrap the Proc in a block, I'm just curious.

    >
    > > Just prefix the object you want to be passed as a block with '&' in
    > > the argument list.

    >
    > > p = proc { |x| x > 10 }

    >
    > > [1,5,10,20, 30].select &p

    >
    > Except that this isn't part of the standard ruby library for 1.8. It
    > relies on having a Symbol#to_proc method
    >

    Wait... what?

    No it doesn't.

    [ 1, 5, 10, 20, 30 ].map &:to_a

    uses Symbol#to_proc

    p = proc { |x| x > 10 }
    [1,5,10,20, 30].select &p

    is standard ruby syntax, even from 1.6:

    "If the last argument to a method is preceded by an ampersand, Ruby
    assumes that it is a Proc object. It removes it from the parameter
    list, converts the Proc object into a block, and associates it with
    the method."
    (see http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_methods.html#UD)
    Noah Easterly, Jan 8, 2008
    #5
  6. On Jan 8, 2008 9:05 AM, Noah Easterly <> wrote:
    > On Jan 8, 8:24 am, Rick DeNatale <> wrote:
    > > On Jan 7, 2008 11:35 PM, Gary Wright <> wrote:
    > > > Just prefix the object you want to be passed as a block with '&' in
    > > > the argument list.

    > >
    > > > p = proc { |x| x > 10 }

    > >
    > > > [1,5,10,20, 30].select &p

    > >
    > > Except that this isn't part of the standard ruby library for 1.8. It
    > > relies on having a Symbol#to_proc method
    > >

    > Wait... what?
    >
    > No it doesn't.
    >
    > [ 1, 5, 10, 20, 30 ].map &:to_a
    >
    > uses Symbol#to_proc
    >
    > p = proc { |x| x > 10 }
    > [1,5,10,20, 30].select &p
    >
    > is standard ruby syntax, even from 1.6:
    >
    > "If the last argument to a method is preceded by an ampersand, Ruby
    > assumes that it is a Proc object. It removes it from the parameter
    > list, converts the Proc object into a block, and associates it with
    > the method."


    This isn't what I said.

    Gary suggested using a symbol as a proc, which requires that Symbol
    implement the to_proc method, which is NOT part of standard Ruby prior
    to 1.9.

    $ qri to_proc
    ------------------------------------------------------ Multiple choices:

    Method#to_proc, Proc#to_proc, Test::Unit::Util::procWrapper#to_proc

    Now as I pointed out extending Symbol to implement to_proc is quite
    common, and many Rails programmers tend to think of the stuff in
    ActiveSupport as being standard Ruby, but it isn't.

    It's likely that Rails will change ActiveSupport to only add
    Symbol#to_proc if using Ruby < 1.9 since 1.9 includes it, but that
    doesn't seem to have happened yet.
    http://dev.rubyonrails.org/ticket/8818

    --
    Rick DeNatale

    My blog on Ruby
    http://talklikeaduck.denhaven2.com/
    Rick DeNatale, Jan 8, 2008
    #6
  7. Rick DeNatale wrote:
    > Gary suggested using a symbol as a proc


    No, he didn't.


    --
    Jabber:
    ICQ: 205544826
    Sebastian Hungerecker, Jan 8, 2008
    #7
  8. L A

    Gary Wright Guest

    On Jan 8, 2008, at 10:39 AM, Rick DeNatale wrote:
    > Gary suggested using a symbol as a proc, which requires that Symbol
    > implement the to_proc method, which is NOT part of standard Ruby prior
    > to 1.9.


    Rick, you just misread my original post a bit. I didn't mention
    Symbol#to_proc at all but I did hint at it by saying you 'just'
    prefix the argument with '&'. That sort of begs the question of
    what happens if the argument isn't an instance of Proc but I didn't
    want to muddy the waters at that point. My example used a proc.

    Gary Wright
    Gary Wright, Jan 8, 2008
    #8
    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. David Lozzi
    Replies:
    3
    Views:
    1,907
    David Lozzi
    Jun 1, 2005
  2. NevilleDNZ
    Replies:
    9
    Views:
    420
    NevilleDNZ
    Aug 16, 2006
  3. Jean-Hugues ROBERT

    Why no Proc##[]=() ? Why no Proc##replace() ?

    Jean-Hugues ROBERT, May 1, 2004, in forum: Ruby
    Replies:
    14
    Views:
    265
    Jean-Hugues ROBERT
    May 5, 2004
  4. Minkoo Seo

    Proc vs lambda vs proc

    Minkoo Seo, Feb 4, 2007, in forum: Ruby
    Replies:
    19
    Views:
    226
    Brian Candler
    Feb 6, 2007
  5. Wolfgang Nádasi-Donner
    Replies:
    0
    Views:
    105
    Wolfgang Nádasi-Donner
    May 31, 2007
Loading...

Share This Page