在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