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
但以通常所说的无点式表达。