我试图弄清楚这段代码中 &: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
但我不知道那是什么意思
在这种情况下&
,需要一个对象,如果该对象还不是 a Proc
,就像 Symbol 的情况一样,:hex
它将尝试调用to_proc
它的方法。在Symbol文档中,您将找到该to_proc
方法的实现细节:
to_proc
返回一个通过 sym 响应给定方法的 Proc 对象。
(1..3).collect(&:to_s) #=> ["1", "2", "3"]
在您的情况下,通过&:hex
符号:hex
将转换为 Proc 对象,相当于{ |item| item.hex() }
Proc 到底是什么?基本上 Proc 类是一个基本的匿名函数。在 Ruby 中,可调用对象的概念通过可以向其发送消息的对象体现在 Ruby 中call
。这些类型的主要代表是Proc
和Lambda
。
Proc 对象是自包含的代码序列,可以创建、存储、作为方法参数传递并在某个时间点通过call
. 类似的方法map
也可以将块作为参数,如果您通过&:hex
.
在方法定义中,map
一种隐式调用Proc.new
是使用相同的块进行的。然后通过其调用方法执行Proc,执行Proc对象所体现的代码。
这两个表达式是等价的:
foo.map {|x| x.hex}
foo.map &:hex