【问题标题】:What is the explanation for &:hex in ruby? [duplicate]ruby 中 &:hex 的解释是什么? [复制]
【发布时间】:2013-08-24 08:51:58
【问题描述】:

我试图弄清楚这段代码中 &:hex 的含义

    sort_by{|x|x.scan(/\d*/).map &:hex}

完整的代码如下所示

 class Array
  def version_sort
   sort_by{|x|x.scan(/\d*/).map &:hex}
  end
 end

我知道 map 会对扫描的部分执行操作,所以我猜它会替换数字

 (/\d*/) 

&:hex

但我不知道这是什么意思

【问题讨论】:

标签: ruby regex loops hash hex


【解决方案1】:

这两个表达式是等价的:

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

【讨论】:

  • 您好,谢谢,您能提供一份文件或阅读材料吗?我想了解有关 &:hex 的更多信息,是否有此类快捷方式/表达式的库?
  • @bolonomicz 我提供的链接有 33 个主题......浏览这些......
【解决方案2】:

在这种情况下,& 接受一个对象,如果该对象还不是Proc,就像符号:hex 的情况一样,它将尝试在其上调用方法to_proc。在Symbol 文档中,您将找到to_proc 方法的实现细节:

to_proc

返回一个通过 sym 响应给定方法的 Proc 对象。

(1..3).collect(&:to_s)  #=> ["1", "2", "3"]

在您的情况下,通过&:hex 符号:hex 将转换为相当于{ |item| item.hex() } 的Proc 对象

Proc 到底是什么?基本上 Proc 类是一个基本的匿名函数。在 Ruby 中,可调用对象 的概念通过对象体现在 Ruby 中,您可以向这些对象发送消息 call。这类的主要代表是ProcLambda

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2015-08-23
    • 2011-07-27
    • 2012-10-27
    • 2017-08-01
    相关资源
    最近更新 更多