Forum: Ruby questions re Method#to_proc

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Eli B. (Guest)
on 2006-04-18 12:39
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...
1) How does it work ?
2) What does it mean for a Proc to be bound to an object ?
3) Can someone provide an example where it is useful ?
4) Have the 'bind' and 'unbind' methods of Method / UnboundMethod
anything in common with Proc#binding or the Binding class ?
5) Have Proc#binding and the Binding class anything in common ? How
about Kernel#binding ?

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 in advance
Yukihiro M. (Guest)
on 2006-04-19 19:30
(Received via mailing list)
Hi,

In message "Re: questions re Method#to_proc"
    on Tue, 18 Apr 2006 17:39:51 +0900, Eli B. 
<removed_email_address@domain.invalid>
writes:

|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]])

This issue will be solved in the future version (1.9), which should
give you the following result:

 Got an array with 3 elements
 Got an array with 3 elements
 Got an array with 1 elements


							matz.
Eli B. (Guest)
on 2006-04-19 21:13
Yukihiro M. wrote:
> |# 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]])
>
> This issue will be solved in the future version (1.9), which should
> give you the following result:
>
>  Got an array with 3 elements
>  Got an array with 3 elements
>  Got an array with 1 elements
>
>
> 							matz.

Thanks, Matz.

By the way, when is 1.9 due ?
Yukihiro M. (Guest)
on 2006-04-20 03:04
(Received via mailing list)
Hi,

In message "Re: questions re Method#to_proc"
    on Thu, 20 Apr 2006 02:14:00 +0900, Eli B. 
<removed_email_address@domain.invalid>
writes:

|By the way, when is 1.9 due ?

You can fetch it from CVS right now.

							matz.
This topic is locked and can not be replied to.