Forums » Ruby » to_proc

to_proc
Posted by Brian Buckley (brian)
on 07.03.2006 19:11
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?
Re: to_proc
Posted by Matthew Moss (Guest)
on 07.03.2006 19:24
I get the error "wrong argument type Symbol (expected Proc)
(TypeError)", not undefined method.
Re: to_proc
Posted by Matthew Moss (Guest)
on 07.03.2006 19:24
Ack, nevermind. I'm a silly person, ignore me.
Re: to_proc
Posted by unknown (Guest)
on 07.03.2006 19:36
Hi --

On Wed, 8 Mar 2006, Brian Buckley wrote:

>
> What's happening?

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


David

--
David A. Black (dblack@wobblini.net)
Ruby Power and Light, LLC (http://www.rubypowerandlight.com)

"Ruby for Rails" chapters now available
from Manning Early Access Program! http://www.manning.com/books/black
Re: to_proc
Posted by Logan Capaldo (Guest)
on 07.03.2006 22:12
On Mar 7, 2006, at 1:09 PM, Brian Buckley 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)