为什么Ruby只允许在调用方法上的_proc时通过符号引用方法?

为什么Ruby只允许在调用方法上的_proc时通过符号引用方法?,ruby,symbols,proc,Ruby,Symbols,Proc,这项工作: strings = ["1", "2", "3"] nums = strings.map(&:to_i) 我们看到应用于符号对象的&(to_proc method)被转换为块。 但是,这不起作用: strings = ["1", "2", "3"] nums = strings.map(&to_i) nums = strings.map("to_i".to_sym.to_proc) #...neither does this 为什么不起作用?难道没有其他方法来编写

这项工作:

strings = ["1", "2", "3"]
nums = strings.map(&:to_i)
我们看到应用于符号对象的&(to_proc method)被转换为块。 但是,这不起作用:

strings = ["1", "2", "3"]
nums = strings.map(&to_i)
nums = strings.map("to_i".to_sym.to_proc) #...neither does this
为什么不起作用?难道没有其他方法来编写上面的代码吗?我很困惑,因为有两种方法可以访问类的方法:

"1".method(:to_i).call #works as well as
"1".method("to_i").call 
因此,可以通过符号或字符串访问方法的名称

nums = strings.map(&to_i)
不起作用,因为主环境中未定义
to_i

nums = strings.map("to_i".to_sym.to_proc)
无法工作,因为
Proc
实例不是块。块甚至不是对象

你可以写:

nums = strings.map(&"to_i".to_sym)

给出以下有效的Ruby示例:

"to_i".to_sym.to_proc.call("1")
在符号上调用
#To_proc
将创建一个接收一个参数的过程:应该接收由符号命名的方法调用的对象。大概是这样的:

->(object) {
  object.send(:to_i)
}
&
所做的是将
#to_proc
返回的块作为正确的调用块传递给被调用的方法。与
可枚举#map
一起使用时,最终结果是 将为集合和接收上的每个元素调用块 作为参数传递给块的当前迭代元素

因此,
[“1”,“2”].map(&:to_i)
语法是指向以下内容的快捷方式 这:

关于你的例子: 在您的示例中,当您尝试调用
&to_i
时,Ruby将尝试调用 名为
to_i
的变量或方法。因为它不存在于 作用域(它是
数组
中每个
字符串
的方法,不在“全局”作用域中),它将生成错误

关于另一个示例:
“to_i”。to_sym.to_proc
将转换
:将i
放入一个进程,当使用一个参数调用时,该进程将尝试 针对目标调用以符号(
:to_i
)命名的方法 参数这意味着您可以使用
来转换过程
进入“调用块”:

block = ->(el) {
  el.send(:to_i)
}

["1", "2"].map &block
["1", "2"].map(&"to_i".to_sym.to_proc)