什么&amp ;:在红宝石中意味着什么,它是一个与符号混合的块?

时间:2012-02-08 05:40:31

标签: ruby

  

可能重复:
  What does map(&:name) mean in Ruby?
  Ruby/Ruby on Rails ampersand colon shortcut

例如,

contacts.sort_by(&:first_name).

我理解这是做什么的,但我不理解&amp ;:符号,这是什么意思,它是一个符号(:)带有一个块(&)?我在哪里可以阅读更多相关信息?

2 个答案:

答案 0 :(得分:8)

在方法调用中在Proc对象之前使用&时,它会将Proc视为调用后的普通块。 当&在方法调用中使用其他类型的对象(在您的情况下为符号:first_name)之前,它会尝试在此对象上调用to_proc,如果它没有to_proc方法,您将获得{{1} }。

通常TypeError&:first_name相同。

  

Symbol#to_proc返回一个Proc对象,该对象通过sym。

响应给定的方法

&:first_name.to_proc将返回如下所示的Proc:

:first_name.to_proc

此Proc调用对象上原始符号指定的方法作为第一个参数传递,并将所有其余参数+块作为此方法参数传递。

又一个例子:

proc { |obj, *args, &block| obj.first_name(*args, &block) }

答案 1 :(得分:3)

contacts.sort_by {|o| o.first_name}

相同

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