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 ?
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 ?
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 ?
In message âRe: questions re Method#to_procâ
on Tue, 18 Apr 2006 17:39:51 +0900, Eli B. [email protected]
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