Ruby &ers冒号快捷方式

时间:2009-12-25 11:35:57

标签: ruby

  

可能重复:
  What does map(&:name) mean in Ruby?

在Ruby中,我知道如果我这样做:

some_objects.each(&:foo)

相同
some_objects.each { |obj| obj.foo }

也就是说,&:foo创建块{ |obj| obj.foo },将其转换为Proc,并将其传递给每个块。为什么这样做?它只是一个Ruby特例,还是有理由为什么这样做呢?

2 个答案:

答案 0 :(得分:460)

你的问题是错的,可以这么说。这里发生的不是“&符号和冒号”,它是“&符号和对象”。在这种情况下,冒号是符号。所以,有&,而且:foo

&调用对象上的to_proc,并将其作为块传递给方法。在Rails中,to_proc是在Symbol上实现的,因此这两个调用是等效的:

something {|i| i.foo }
something(&:foo)

另外,to_proc上的Symbol是在Ruby 1.8.7和1.9中实现的,所以它实际上是一个“红宝石”。

因此,总结一下:&在对象上调用to_proc并将其作为块传递给方法,Ruby在to_proc上实现Symbol

答案 1 :(得分:80)

&符号和符号的组合没有什么特别之处。这是(ab)使用正则表达式的示例:

class Regexp
  def to_proc
    ->(str) { self =~ str ; $1 }
  end
end
%w(station nation information).map &/(.*)ion/

=> ["stat", "nat", "informat"]

或整数。

class Integer
  def to_proc
    ->(arr) { arr[self] }
  end
end

arr = [[*3..7],[*14..27],[*?a..?z]]
arr.map &4
=> [7, 18, "e"]

当您arr.map(&:fifth)时,谁需要arr.map &4