什么&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作为唯一参数传递。
:function是Symbol文字,即它是 a 的文字符号Symbol。Symbol是表示“某物的名称”的数据类型。
一元前缀 &&运算符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 风格表示。
| 归档时间: |
|
| 查看次数: |
730 次 |
| 最近记录: |