Hi all.
I'm writing a method which takes a block and returns a lambda which will
execute that block when called. Here's the code:
def foo &block
Proc.new { yield }
end
a = foo { 3 }
puts a
This returns something like #<Proc:0x2a50b08@scratch2.rb:2 (lambda)>. That's
all well and good, but what I'd really like is for that line number to show
up as 5, since that's where the block is actually defined. So I try this:
def foo &block
a = Proc.new { yield }
def a.to_s
block.to_s
end
a
end
a = foo { 3 }
puts a
But here, ruby tells me that 'block' is undefined inside a's to_s. It's
clearly not creating the closure I'd hoped for. I've played around with a
few variations, but can't seem to get it to do what I want. Suggestions?
def creates a new scope, not a closure. Try define_method:
def foo &block
a = Proc.new {yield}
class << a; self; end.send(:define_method, :to_s) {block.to_s}
a
end
Jesus.
···
On Sat, Oct 23, 2010 at 7:43 PM, Andrew Wagner <wagner.andrew@gmail.com> wrote:
Hi all.
I'm writing a method which takes a block and returns a lambda which will
execute that block when called. Here's the code:
def foo &block
Proc.new { yield }
end
a = foo { 3 }
puts a
This returns something like #<Proc:0x2a50b08@scratch2.rb:2 (lambda)>. That's
all well and good, but what I'd really like is for that line number to show
up as 5, since that's where the block is actually defined. So I try this:
def foo &block
a = Proc.new { yield }
def a.to_s
block.to_s
end
a
end
a = foo { 3 }
puts a
But here, ruby tells me that 'block' is undefined inside a's to_s. It's
clearly not creating the closure I'd hoped for. I've played around with a
few variations, but can't seem to get it to do what I want. Suggestions?
Well maybe the answer is to create a proc with the right line number
from the beginning:
def foo &block
Proc.new(&block)
end
a = foo { 3 }
puts a
puts a.call
#<Proc:0x000000010012e688@untitled:5>
3
···
On Sat, Oct 23, 2010 at 1:43 PM, Andrew Wagner <wagner.andrew@gmail.com> wrote:
def foo &block
Proc.new { yield }
end
a = foo { 3 }
puts a
--
Rick DeNatale
Help fund my talk at Ruby Conf 2010:http://pledgie.com/campaigns/13677
Blog: http://talklikeaduck.denhaven2.com/
Github: rubyredrick (Rick DeNatale) · GitHub
Twitter: @RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale