gpt4 book ai didi

ruby - 为什么 Ruby 在调用 to_proc 时只允许通过符号引用方法?

转载 作者:数据小太阳 更新时间:2023-10-29 07:31:45 26 4
gpt4 key购买 nike

这个有效:

strings = ["1", "2", "3"]
nums = strings.map(&:to_i)

我们看到应用于 Symbol 对象的 & (to_proc 方法) 变成了一个 block 。但是,这不起作用:

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

因此可以通过符号或字符串访问方法的名称。

最佳答案

给定以下有效的 Ruby 示例:

"to_i".to_sym.to_proc.call("1")

在符号上调用#to_proc 会创建一个接收一个参数的过程:该对象应该接收对符号命名的方法的调用。像这样:

->(object) {
object.send(:to_i)
}

& 所做的是将 #to_proc 返回的 block 作为适当的调用 block 传递给被调用的方法。当与Enumerable#map一起使用时,最终结果是传递的将为集合中的每个元素调用 block 并接收当前迭代元素作为参数传递给 block 。

所以 ["1", "2"].map(&:to_i) 语法是类似于这个:

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

["1", "2"].map &block

关于你的例子:

当您尝试在示例中调用 &to_i 时,Ruby 将尝试调用名为 to_i 的变量或方法。因为它不存在于作用域(它是 Array 中每个 String 的方法,而不是“全局”作用域),它会产生错误。

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

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

关于ruby - 为什么 Ruby 在调用 to_proc 时只允许通过符号引用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34863450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com