# To\_proc

**URL:** <https://www.ruby-forum.com/t/to-proc/77962>\
**Category:** Ruby\
**Created:** [March 7, 2006, 7:11pm UTC](https://www.ruby-forum.com/t/to-proc/77962 "2006-03-07T19:11:55Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![brian](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/97f17d/32.png) [@brian](https://www.ruby-forum.com/u/brian)\
**Post date:** [March 7, 2006, 7:11pm UTC](https://www.ruby-forum.com/t/to-proc/77962/1 "2006-03-07T19:11:55Z")

</div>

require ‘facet/symbol/to\_proc’

[[1,2], [], [1,2,3]].map(&:length) #line 1 Blows up re undefined method  
length for Fixnum?

[“ab”, “”, “abc”].map(&:length) #line 2 =\> [2, 0, 3] but this works  
fine

Why does the first line fail by trying to call method length on Fixnum?  
Shouldn’t it be calling length on Array (which is defined) and thus  
return  
[2,0,3] ? Note the next line behaves as I’d expect, but for Strings.

What’s happening?

---

<div class="post-metadata">

**Author:** ![brian](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/97f17d/32.png) [@brian](https://www.ruby-forum.com/u/brian)\
**Post date:** [March 7, 2006, 7:24pm UTC](https://www.ruby-forum.com/t/to-proc/77962/2 "2006-03-07T19:24:10Z")

</div>

I get the error “wrong argument type Symbol (expected Proc)  
(TypeError)”, not undefined method.

---

<div class="post-metadata">

**Author:** ![brian](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/97f17d/32.png) [@brian](https://www.ruby-forum.com/u/brian)\
**Post date:** [March 7, 2006, 7:24pm UTC](https://www.ruby-forum.com/t/to-proc/77962/3 "2006-03-07T19:24:10Z")

</div>

Ack, nevermind. I’m a silly person, ignore me.

---

<div class="post-metadata">

**Author:** ![brian](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/97f17d/32.png) [@brian](https://www.ruby-forum.com/u/brian)\
**Post date:** [March 7, 2006, 7:36pm UTC](https://www.ruby-forum.com/t/to-proc/77962/4 "2006-03-07T19:36:20Z")

</div>

Hi –

On Wed, 8 Mar 2006, Brian B. wrote:

> What’s happening?

I’m only guessing but could it be flattening the outer array?

David

–  
David A. Black (removed\_email\_address@domain.invalid)  
Ruby Power and Light, LLC ([http://www.rubypowerandlight.com](http://www.rubypowerandlight.com))

“Ruby for Rails” chapters now available  
from Manning Early Access Program! [Ruby for Rails](http://www.manning.com/books/black)

---

<div class="post-metadata">

**Author:** ![brian](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/97f17d/32.png) [@brian](https://www.ruby-forum.com/u/brian)\
**Post date:** [March 7, 2006, 10:12pm UTC](https://www.ruby-forum.com/t/to-proc/77962/5 "2006-03-07T22:12:36Z")

</div>

On Mar 7, 2006, at 1:09 PM, Brian B. wrote:

> Fixnum?  
> Shouldn’t it be calling length on Array (which is defined) and thus  
> return  
> [2,0,3] ? Note the next line behaves as I’d expect, but for Strings.
> 
> What’s happening?

I figured it out! I figured it out!

theorizing that to\_proc was implemented thusly:

class Symbol  
def to\_proc  
lambda { |obj, \*args| obj.send(self, \*args) }  
end  
end

which would be fine, except, ba bum bum! you have an array of arrays!  
map or each or someone is passing it via yield which is  
sending :length.to\_proc.call two args which turns into 1.send  
(:length, 2)
