我正在阅读Stackoverflow并偶然发现以下代码
array.map(&:to_i)
Run Code Online (Sandbox Code Playgroud)
好的,很容易看出这段代码的作用,但我想了解更多关于&:我以前从未见过的构造.
不幸的是,我能想到的只是"lambda",而不是.谷歌告诉我Ruby中的lambda语法是->->(x,y){ x * y }
所以&:除了调用单一方法之外,任何人都知道神秘是什么以及它能做什么?
Joh*_*lla 64
这里有一些活动的部分,但正在进行的是Symbol#to_proc转换的名称.这是Ruby 1.9及更高版本的一部分,如果你使用后来的Rails版本,也可以使用它.
首先,在Ruby中,:foo意思是"符号foo",所以它实际上是你正在看的两个独立的运算符,而不是一个大&:运算符.
当你说foo.map(&bar),你告诉Ruby时,"向foo对象发送一条消息来调用该map方法,我已经定义了一个名为bar" 的块." 如果bar还不是Proc对象,Ruby将尝试将其设为一个对象.
在这里,我们实际上并没有传递一个块,而是一个名为的符号bar.因为我们有一个隐式to_proc转换Symbol,Ruby会看到并使用它.事实证明,这种转换看起来像这样:
def to_proc
proc { |obj, *args| obj.send(self, *args) }
end
Run Code Online (Sandbox Code Playgroud)
这使得a proc调用与符号同名的方法.将所有内容放在一起,使用您的原始示例:
array.map(&:to_i)
Run Code Online (Sandbox Code Playgroud)
这将调用.map数组,并为数组中的每个元素返回调用to_i该元素的结果.
| 归档时间: |
|
| 查看次数: |
15656 次 |
| 最近记录: |