我在RailsCast中找到了这段代码:
def tag_names
@tag_names || tags.map(&:name).join(' ')
end
map(&:name)中的(&:name)是什么意思?
我在RailsCast中找到了这段代码:
def tag_names
@tag_names || tags.map(&:name).join(' ')
end
map(&:name)中的(&:name)是什么意思?
当前回答
如下所示:
def tag_names
if @tag_names
@tag_names
else
tags.map{ |t| t.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
它等价于
def tag_names
@tag_names || tags.map { |tag| tag.name }.join(' ')
end
tags.map(&:name)
是一样的
tags.map{|tag| tag.name}
&:name只是使用符号作为要调用的方法名。
虽然我们已经有了很好的答案,但从初学者的角度来看,我想添加额外的信息:
map(&:name)在Ruby中是什么意思?
这意味着,您正在将另一个方法作为参数传递给map函数。 (实际上,您传递的是一个符号,该符号将被转换为proc。但在这种特殊情况下,这并不那么重要)。
重要的是,您有一个名为name的方法,它将被map方法用作参数,而不是传统的块样式。
它是标签的简写。映射{|标记|tag .name}。加入(' ')