我在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)是什么意思?
当前回答
首先,&:name是&:name的快捷键。To_proc,其中:name。to_proc返回一个Proc(类似于lambda,但不完全相同),当以对象作为(第一个)参数调用时,调用该对象的name方法。
其次,当& in def foo(&block)…end将传递给foo的块转换为Proc,当应用到Proc时则相反。
因此,&:名字。To_proc是一个以一个对象作为参数并调用该对象上的name方法的块,即{|o| o.name}。
其他回答
它等价于
def tag_names
@tag_names || tags.map { |tag| tag.name }.join(' ')
end
同时让我们也注意到& #to_proc魔法可以对任何类工作,而不仅仅是符号。很多ruby会选择在Array类上定义#to_proc:
class Array
def to_proc
proc { |receiver| receiver.send *self }
end
end
# And then...
[ 'Hello', 'Goodbye' ].map &[ :+, ' world!' ]
#=> ["Hello world!", "Goodbye world!"]
&的工作原理是在其操作数上发送to_proc消息,在上面的代码中,操作数属于Array类。因为我在Array上定义了#to_proc方法,所以这一行变成:
[ 'Hello', 'Goodbye' ].map { |receiver| receiver.send( :+, ' world!' ) }
tags.map(&:name)
是一样的
tags.map{|tag| tag.name}
&:name只是使用符号作为要调用的方法名。
首先,&:name是&:name的快捷键。To_proc,其中:name。to_proc返回一个Proc(类似于lambda,但不完全相同),当以对象作为(第一个)参数调用时,调用该对象的name方法。
其次,当& in def foo(&block)…end将传递给foo的块转换为Proc,当应用到Proc时则相反。
因此,&:名字。To_proc是一个以一个对象作为参数并调用该对象上的name方法的块,即{|o| o.name}。
(&:name)是(&:name.to_proc)的缩写,与标签相同。映射{|t| t.name}。加入(' ')
to_proc实际上是用C语言实现的