Logan Capaldo
3/7/2006 9:12:00 PM
On Mar 7, 2006, at 1:09 PM, Brian Buckley wrote:
> 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?
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)