我试图找出此代码中的&:hex意思
sort_by{|x|x.scan(/\d*/).map &:hex}
完整代码如下所示
class Array
def version_sort
sort_by{|x|x.scan(/\d*/).map &:hex}
end
end
我知道地图会对扫描部分执行操作,所以我猜它会替换数字
(/\d*/)
带
&:hex
但我不知道这意味着什么
答案 0 :(得分:3)
在这种情况下,&
接受一个对象,如果该对象不是Proc
,则符号为:hex
,它将尝试调用方法{{} 1}}就可以了。在Symbol文档中,您将找到to_proc
方法的实现细节:
<强> to_proc 强>
返回一个Proc对象,该对象通过sym。
响应给定的方法to_proc
在您通过(1..3).collect(&:to_s) #=> ["1", "2", "3"]
的情况下,符号&:hex
将转换为Proc对象,该对象相当于:hex
什么是Proc?基本上,Proc类是一个基本的匿名函数。在Ruby中,可调用对象的概念通过可以向其发送消息{ |item| item.hex() }
的对象体现在Ruby中。这类主要代表是call
和Proc
。
Proc对象是自包含的代码序列,可以创建,存储,作为方法参数传递,并在Lambda
的某个时刻执行。像call
这样的方法也可以将块作为参数,如果您通过map
就是这种情况。
在&:hex
的方法定义中,使用完全相同的块对map
进行了一种隐式调用。然后,Proc通过其调用方法执行,执行Proc对象所体现的代码。
答案 1 :(得分:1)
这两个表达式是等价的:
foo.map {|x| x.hex}
foo.map &:hex