|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
[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 |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
On Jan 8, 2008 12:06 PM, L A <loren.abrams@yahoo.com> 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 |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
On Jan 7, 2008 11:35 PM, Gary Wright <gwtmp01@mac.com> 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/ |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
On Jan 8, 8:24 am, Rick DeNatale <rick.denat...@gmail.com> wrote:
> On Jan 7, 2008 11:35 PM, Gary Wright <gwtm...@mac.com> 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/Program...ethods.html#UD) |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
On Jan 8, 2008 9:05 AM, Noah Easterly <noah.easterly@gmail.com> wrote:
> On Jan 8, 8:24 am, Rick DeNatale <rick.denat...@gmail.com> wrote: > > On Jan 7, 2008 11:35 PM, Gary Wright <gwtm...@mac.com> 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/ |
|
|
|
#7 |
|
Messages: n/a
Hébergeur: |
Rick DeNatale wrote:
> Gary suggested using a symbol as a proc No, he didn't. -- Jabber: sepp2k@jabber.org ICQ: 205544826 |
|
|
|
#8 |
|
Messages: n/a
Hébergeur: |
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 |
|
![]() |
| Outils de la discussion | |
|
|