红宝石中&:hex的解释是什么?

时间:2013-08-21 20:05:22

标签: ruby regex loops hash hex

我试图找出此代码中的&: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

但我不知道这意味着什么

2 个答案:

答案 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中。这类主要代表是callProc

Proc对象是自包含的代码序列,可以创建,存储,作为方法参数传递,并在Lambda的某个时刻执行。像call这样的方法也可以将块作为参数,如果您通过map就是这种情况。

&:hex的方法定义中,使用完全相同的块对map进行了一种隐式调用。然后,Proc通过其调用方法执行,执行Proc对象所体现的代码。

答案 1 :(得分:1)

这两个表达式是等价的:

foo.map {|x| x.hex}
foo.map &:hex