在Ruby中map(&:name)是什么意思?

我在RailsCast中找到了这段代码:

def tag_names
  @tag_names || tags.map(&:name).join(' ')
end

什么是(&:name)map(&:name)是什么意思?


它是tags.map(&:name.to_proc).join(' ')的缩写

如果foo是一个带有to_proc方法的对象,那么可以将它作为&foo传递给一个方法,该方法将调用foo.to_proc并将其用作方法的块。

Symbol#to_proc方法最初由ActiveSupport添加,但已被集成到Ruby 1.8.7中。 这是它的实现:

class Symbol
  def to_proc
    Proc.new do |obj, *args|
      obj.send self, *args
    end
  end
end

另一个很酷的速记,很多人都不知道

array.each(&method(:foo))

这是一个简写

array.each { |element| foo(element) }

通过调用method(:foo)我们从self了一个表示它的foo方法的Method对象,并使用&表示它有一个to_proc方法将它转换为Proc

这是非常有用的,当你想做的事情无点风格。 一个例子是检查数组中是否有任何字符串等于字符串"foo" 。 有传统的方式:

["bar", "baz", "foo"].any? { |str| str == "foo" }

并且有一个无点的方法:

["bar", "baz", "foo"].any?(&"foo".method(:==))

首选的方式应该是最可读的。


这相当于

def tag_names
  @tag_names || tags.map { |tag| tag.name }.join(' ')
end
链接地址: http://www.djcxy.com/p/9945.html

上一篇: What does map(&:name) mean in Ruby?

下一篇: What does "static" mean in C?