What does &method(:function)
mean? For example, I have this line:
res = integrate(0, 1, a, &method(:function))
What does &method(:function)
mean? For example, I have this line:
res = integrate(0, 1, a, &method(:function))
Say we have a method
def add_one(num)
num + 1
end
and an array of strings
arr = ["1", "2"]
We want to map
the list of strings to their corresponding outputs from add_one
.
To start out we can call
nums = arr.map(&:to_i)
This is the same thing as
nums = arr.map do |str|
str.to_i
end
You can see What does map(&:name) mean in Ruby? for more info on this.
However, it won't work to call:
nums.map(&:add_one)
Why? Because numbers have no built in method add_one
. So you'll get a NoMethodError
.
So, rather than providing just a method name :add_one
you can pass an bound method method(:add_one)
:
nums.map(&method(:add_one))
Now, rather than each num being used as the receiver for the add_one
method, they will be used as arguments. So, it's essentially the same as:
nums.map do |num|
add_one(num)
end
To give another example, compare the following:
[1].map(&:puts)
# this is the same as [1].map { |num| num.puts }
# it raises NoMethodError
[1].map(&method(:puts))
# this is the same as [1].map { |num| puts num }
# it prints 1 successfully
method(:function)
is a message send (sometimes called a method call) to the implicit receiver (i.e. self
). It is sending the message method
to the implicit receiver (i.e. self
), passing :function
as the sole argument.
:function
is a Symbol
literal, i.e. it is the literal notation of a Symbol
. Symbol
is a data type representing "the name of something".
The unary prefix ampersand &
operator "unrolls" a Proc
into a block. I.e. it allows you to pass a Proc
where a block is expected. If the object is not already a Proc
, it will be sent the to_proc
message allowing it to convert itself into a Proc
. (The operator is only legal in an argument list and only for the last argument. It is the dual of the &
sigil in a parameter list, which "rolls" a block into a Proc
object.)
Proc
is a datatype representing executable code. It is Ruby's core library class for first-class subroutines.
So, what this does, is call the method
method on self
with :function
as the argument, call to_proc
on the return value, "unroll" the resulting Proc
object into a block and pass that block to the call to integrate
as if you had written something like
res = integrate(0, 1, a) do
# something
end
The method
method here is most likely, the Object#method
method, which returns a bound Method
object.
So, all in all, this is somewhat equivalent to
res = integrate(0, 1, a) do |*args, &block|
function(*args, &block)
end
But expressed in what is commonly called pointfree style.