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


15

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

res = integrate(0, 1, a, &method(:function))

到目前为止,有两个很好的答案。幸运的你!
卡里·斯沃夫兰

Answers:


13

说我们有一种方法

def add_one(num)
  num + 1
end

和一个字符串数组

arr = ["1", "2"]

我们想要将map字符串列表转换为它们对应的输出add_one

首先,我们可以打电话

nums = arr.map(&:to_i)

这与

nums = arr.map do |str|
  str.to_i
end

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

但是,无法调用:

nums.map(&:add_one)

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

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

nums.map(&method(:add_one))

现在,而不是将每个NUM被用作接收器add_one方法,它们将被作为参数。因此,它基本上与以下内容相同:

nums.map do |num|
  add_one(num)
end

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

[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

Nitpick:Object#method返回一个bound Method,而不是一个UnboundMethod。该方法绑定到接收者,因为您正在实例上调用它,因此它知道是什么self,而Module#instance_method返回an是UnboundMethod因为它不知道它将与之一起使用的实例。
约尔格W¯¯米塔格

@JörgWMittag好,谢谢您的纠正,您是对的,我必须一直将其混合在一起,.instance_method因为我只是在经历(有缺陷的)内存
最大整理者

10

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

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

一元前缀&&运算符将a展开Proc为一个。即,它允许您传递一个期望Proc。如果对象还不是Proc,则将向其发送to_proc消息,使其可以将自身转换为Proc。(运算符仅在参数列表中是合法的,并且仅对于最后一个参数是合法的。它是&参数列表中符号的对偶,它将块“滚动”到Proc对象中。)

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

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

res = integrate(0, 1, a) do
  # something
end

method这里的方法很可能是Object#method返回绑定 Method对象的方法。

所以总而言之,这相当于

res = integrate(0, 1, a) do |*args, &block|
  function(*args, &block)
end

但以通常所说的无点式表达

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.