0

我试图弄清楚这段代码中 &: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

但我不知道那是什么意思

4

2 回答 2

3

在这种情况下&,需要一个对象,如果该对象还不是 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。这些类型的主要代表是ProcLambda

Proc 对象是自包含的代码序列,可以创建、存储、作为方法参数传递并在某个时间点通过call. 类似的方法map也可以将块作为参数,如果您通过&:hex.

在方法定义中,map一种隐式调用Proc.new是使用相同的块进行的。然后通过其调用方法执行Proc,执行Proc对象所体现的代码。

于 2013-08-21T20:19:09.980 回答
1

这两个表达式是等价的:

foo.map {|x| x.hex}
foo.map &:hex
于 2013-08-21T20:09:26.557 回答