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

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

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


当前回答

tags.map(&:name)

是一样的

tags.map{|tag| tag.name}

&:name只是使用符号作为要调用的方法名。

其他回答

它是标签的简写。映射{|标记|tag .name}。加入(' ')

如下所示:

def tag_names
  if @tag_names
    @tag_names
  else
    tags.map{ |t| t.name }.join(' ')
end

它等价于

def tag_names
  @tag_names || tags.map { |tag| tag.name }.join(' ')
end

它是tags.map(&:name.to_proc)的简写。加入(' ')

如果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

它基本上在数组中的每个标签上执行方法调用tag.name。

它是一个简化的ruby简写。