To_proc


#1

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?


#2

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


#3

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


#4

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)

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


#5

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)