proc to block

L

L A

[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
 
G

Gary Wright

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
 
B

botp

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
 
R

Rick DeNatale

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"
 
N

Noah Easterly

On Jan 7, 2008, at 11:06 PM, L A 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."
(see http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_methods.html#UD)
 
R

Rick DeNatale

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
 
G

Gary Wright

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
 

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,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top