我在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
@tag_names || tags.map { |tag| tag.name }.join(' ')
end
其他回答
它的意思是
array.each(&:to_sym.to_proc)
虽然我们已经有了很好的答案,但从初学者的角度来看,我想添加额外的信息:
map(&:name)在Ruby中是什么意思?
这意味着,您正在将另一个方法作为参数传递给map函数。 (实际上,您传递的是一个符号,该符号将被转换为proc。但在这种特殊情况下,这并不那么重要)。
重要的是,您有一个名为name的方法,它将被map方法用作参数,而不是传统的块样式。
它等价于
def tag_names
@tag_names || tags.map { |tag| tag.name }.join(' ')
end
另一个很酷的简写,很多人不知道,是
array.each(&method(:foo))
这是一个简写
array.each { |element| foo(element) }
通过调用method(:foo),我们从self中获取了一个method对象,该对象表示它的foo方法,并使用&表示它有一个to_proc方法,该方法将它转换为Proc。
这是非常有用的,当你想做点自由风格的事情。一个例子是检查数组中是否有字符串等于字符串“foo”。有一种传统的方式:
["bar", "baz", "foo"].any? { |str| str == "foo" }
还有一种简单的方法:
["bar", "baz", "foo"].any?(&"foo".method(:==))
首选的方式应该是最易读的方式。
它基本上在数组中的每个标签上执行方法调用tag.name。
它是一个简化的ruby简写。