Answers:
说我们有一种方法
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
Object#method返回一个bound Method,而不是一个UnboundMethod。该方法绑定到接收者,因为您正在实例上调用它,因此它知道是什么self,而Module#instance_method返回an是UnboundMethod因为它不知道它将与之一起使用的实例。
.instance_method因为我只是在经历(有缺陷的)内存
method(:function)是向隐式接收者(即)发送的消息(有时称为方法调用self)。它正在将消息发送method到隐式接收者(即self),:function作为唯一的参数传递。
:function是Symbol文字,即是的文字符号Symbol。Symbol是表示“事物名称”的数据类型。
一元前缀&&运算符将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
但以通常所说的无点式表达。