# Returning Procs from methods?

**URL:** <https://www.ruby-forum.com/t/returning-procs-from-methods/77637>\
**Category:** Ruby\
**Created:** [November 29, 2006, 12:12pm UTC](https://www.ruby-forum.com/t/returning-procs-from-methods/77637 "2006-11-29T12:12:43Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Giles\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/848f3c/32.png) [@Giles\_B](https://www.ruby-forum.com/u/Giles_B)\
**Post date:** [November 29, 2006, 12:12pm UTC](https://www.ruby-forum.com/t/returning-procs-from-methods/77637/1 "2006-11-29T12:12:43Z")

</div>

I’ve got something which basically does this:

some\_string.scan(/(whatever)/).each &do\_stuff

where &do\_stuff is a Proc.

currently there’s a case/when that assigns different Procs to do\_stuff  
depending on the value of some\_string.

what I want to do is something like this:

some\_string.scan(/(whatever)/).each do\_stuff

where do\_stuff() is a method which figures out what Proc to return to  
the each().

however, I can’t seem to build a method which returns a Proc.

can it be done?

---

<div class="post-metadata">

**Author:** ![Giles\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/848f3c/32.png) [@Giles\_B](https://www.ruby-forum.com/u/Giles_B)\
**Post date:** [November 29, 2006, 12:20pm UTC](https://www.ruby-forum.com/t/returning-procs-from-methods/77637/2 "2006-11-29T12:20:44Z")

</div>

On 11/29/06, Giles B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> some\_string.scan(/(whatever)/).each do\_stuff
> 
> where do\_stuff() is a method which figures out what Proc to return to  
> the each().
> 
> however, I can’t seem to build a method which returns a Proc.
> 
> can it be done?

sure

def do\_stuff  
lambda {|a| a+1}  
end

b = [1,2].map(&do\_stuff)

/Robert F.

---

<div class="post-metadata">

**Author:** ![Giles\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/848f3c/32.png) [@Giles\_B](https://www.ruby-forum.com/u/Giles_B)\
**Post date:** [November 29, 2006, 12:24pm UTC](https://www.ruby-forum.com/t/returning-procs-from-methods/77637/3 "2006-11-29T12:24:45Z")

</div>

awesome! thank you.

---

<div class="post-metadata">

**Author:** ![Giles\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/848f3c/32.png) [@Giles\_B](https://www.ruby-forum.com/u/Giles_B)\
**Post date:** [November 29, 2006, 12:24pm UTC](https://www.ruby-forum.com/t/returning-procs-from-methods/77637/4 "2006-11-29T12:24:45Z")

</div>

On 11/29/06, Robert F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > 
> 
> sure
> 
> def do\_stuff  
> lambda {|a| a+1}  
> end
> 
> b = [1,2].map(&do\_stuff)

lambda {|a| a+1} is the new “hello world” 🙂

martin

---

<div class="post-metadata">

**Author:** ![Giles\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/848f3c/32.png) [@Giles\_B](https://www.ruby-forum.com/u/Giles_B)\
**Post date:** [November 29, 2006, 10:43pm UTC](https://www.ruby-forum.com/t/returning-procs-from-methods/77637/5 "2006-11-29T22:43:12Z")

</div>

Giles B. wrote:

> some\_string.scan(/(whatever)/).each do\_stuff
> 
> where do\_stuff() is a method which figures out what Proc to return to  
> the each().
> 
> however, I can’t seem to build a method which returns a Proc.
> 
> can it be done?

The foo method returns the proc

def foo  
lambda { |x| x + 2 }  
end

foo.call(4) #6

def other\_foo(&b)  
b  
end

var = other\_foo { |x| x + 2 }  
var.call(4) #6

---

<div class="post-metadata">

**Author:** ![Giles\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/848f3c/32.png) [@Giles\_B](https://www.ruby-forum.com/u/Giles_B)\
**Post date:** [November 29, 2006, 12:22pm UTC](https://www.ruby-forum.com/t/returning-procs-from-methods/77637/6 "2006-11-29T12:22:44Z")

</div>

On 11/29/06, Giles B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> however, I can’t seem to build a method which returns a Proc.
> 
> can it be done?

Yes, but you still need to prefix it with a & when passing it to a  
method that expects a block.

irb(main):001:0\> def foo  
irb(main):002:1\> lambda {|x| x+1}  
irb(main):003:1\> end  
=\> nil  
irb(main):004:0\> (1…10).map foo  
ArgumentError: wrong number of arguments (1 for 0)  
from (irb):4:in `map’  
from (irb):4  
irb(main):005:0\> (1…10).map &foo  
=\> [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

martin
