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

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

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


当前回答

这里:name是指向标记对象的方法名的符号。 当我们将&:name传递给map时,它将把name作为一个proc对象。 简而言之,tags.map(&:name)充当:

tags.map do |tag|
  tag.name
end

其他回答

虽然我们已经有了很好的答案,但从初学者的角度来看,我想添加额外的信息:

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

这意味着,您正在将另一个方法作为参数传递给map函数。 (实际上,您传递的是一个符号,该符号将被转换为proc。但在这种特殊情况下,这并不那么重要)。

重要的是,您有一个名为name的方法,它将被map方法用作参数,而不是传统的块样式。

如下所示:

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

首先,&:name是&:name的快捷键。To_proc,其中:name。to_proc返回一个Proc(类似于lambda,但不完全相同),当以对象作为(第一个)参数调用时,调用该对象的name方法。

其次,当& in def foo(&block)…end将传递给foo的块转换为Proc,当应用到Proc时则相反。

因此,&:名字。To_proc是一个以一个对象作为参数并调用该对象上的name方法的块,即{|o| o.name}。

tags.map(&:name)

是一样的

tags.map{|tag| tag.name}

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

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