`&method(:function)` 是什么意思?

Rub*_*ner 17 ruby

什么&method(:function)意思?例如,我有这一行:

res = integrate(0, 1, a, &method(:function))
Run Code Online (Sandbox Code Playgroud)

max*_*ner 15

说我们有一个方法

def add_one(num)
  num + 1
end
Run Code Online (Sandbox Code Playgroud)

和一个字符串数组

arr = ["1", "2"]
Run Code Online (Sandbox Code Playgroud)

我们希望将map字符串列表从add_one.

首先我们可以打电话

nums = arr.map(&:to_i)
Run Code Online (Sandbox Code Playgroud)

这与

nums = arr.map do |str|
  str.to_i
end
Run Code Online (Sandbox Code Playgroud)

您可以看到Ruby 中的 map(&:name) 是什么意思?有关这方面的更多信息。

但是,调用以下方法是行不通的:

nums.map(&:add_one)
Run Code Online (Sandbox Code Playgroud)

为什么?因为数字没有内置方法add_one。所以你会得到一个NoMethodError.

因此,您可以传递绑定方法,而不是仅提供方法名称:add_one method(:add_one)

nums.map(&method(:add_one))
Run Code Online (Sandbox Code Playgroud)

现在,而不是将每个NUM被用作接收器add_one方法,它们将被作为参数。所以,它本质上是一样的:

nums.map do |num|
  add_one(num)
end
Run Code Online (Sandbox Code Playgroud)

再举一个例子,比较以下内容:

[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
Run Code Online (Sandbox Code Playgroud)


Jör*_*tag 11

method(:function)是向隐式接收器(即)发送消息(有时称为方法调用self)。它将消息发送method到隐式接收器(即self),:function作为唯一参数传递。

:functionSymbol文字,即它是 a 的文字符号SymbolSymbol是表示“某物的名称”的数据类型。

一元前缀 &&运算符Proc将 a “展开”到一个块中。即它允许你通过Proc一个预期的地方。如果该对象还不是 a Proc,则会向其发送to_proc消息,允许其将自身转换为 a Proc。(运算符仅在参数列表中合法,并且仅对最后一个参数有效。它是&参数列表中的符号的对偶,它将块“滚动”为Proc对象。)

Proc是表示可执行代码的数据类型。它是用于一流子程序的 Ruby 核心库类。

那么,这是什么一样,是调用method的方法self:function作为参数,调用to_proc的返回值,“披”所产生的Proc对象成和块传递给调用integrate,如果你写的东西一样

res = integrate(0, 1, a) do
  # something
end
Run Code Online (Sandbox Code Playgroud)

method这里的方法最有可能是Object#method方法,它返回一个绑定 Method对象。

所以,总而言之,这有点等价于

res = integrate(0, 1, a) do |*args, &block|
  function(*args, &block)
end
Run Code Online (Sandbox Code Playgroud)

但是以通常所说的pointfree 风格表示