[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

questions re Method#to_proc

Eli Bendersky

4/16/2006 2:50:00 PM

Hello all,

Some things are unclear to me about Method#to_proc. I understand the
following:

plus = 12.method("+")
p plus.call(13) # prints 25

newplus = plus.unbind.bind(20)
p newplus.call(13) # prints 33

Although the usefulness of this eludes me :-)

However, this:

plus_proc = plus.to_proc
p plus_proc.call(10) # prints 10

Is unclear... How does it work ? What does it mean for a Proc to be
bound to an object ? Can someone provide an example where it is useful
?

Also, have the 'bind' and 'unbind' methods of Method / UnboundMethod
anything in common with Proc#binding or the Binding class ? Have
Proc#binding and the Binding class anything in common ? How about
Kernel#binding ?

Thanks,
Eli

1 Answer

Eli Bendersky

4/17/2006 11:01:00 AM

0

Eli Bendersky wrote:
> Hello all,
>
> Some things are unclear to me about Method#to_proc. I understand the
> following:
>
> plus = 12.method("+")
> p plus.call(13) # prints 25
>
> newplus = plus.unbind.bind(20)
> p newplus.call(13) # prints 33
>
> Although the usefulness of this eludes me :-)
>
> However, this:
>
> plus_proc = plus.to_proc
> p plus_proc.call(10) # prints 10
>
> Is unclear... How does it work ? What does it mean for a Proc to be
> bound to an object ? Can someone provide an example where it is useful
> ?
>
> Also, have the 'bind' and 'unbind' methods of Method / UnboundMethod
> anything in common with Proc#binding or the Binding class ? Have
> Proc#binding and the Binding class anything in common ? How about
> Kernel#binding ?
>

Has anyone insights on this topic ?

Additionally, the following, IMHO demostrates a very surprising and
unnatural behavior of to_proc:

def foo(arr)
puts "Got an array with #{arr.length} elements"
end

# works correctly
foo([4, 5, 6])

foo_proc = method(:foo).to_proc

# throws an ArgumentError: 3 for 1
foo_proc.call([4, 5, 6])

# works correctly
foo_proc.call([[4, 5, 6]])

The Proc created by to_proc is obviously different from the original
method, since it "folds" its arguments into an array. I guess there
will be even more problems when the method receives more than one array
as an argument.
How should this be handled correctly ?

Thanks
Eli