在ruby中,我可以使用以下快捷方式来映射对象属性:
objects.map(&:attribute)
与:
相同objects.map { |object| object.attribute }
是否有类似的快捷方式,我找到属性等于x
的第一个对象?
def find_first_with_matching_attribute(x)
objects.detect { |object| object.attribute == x }
end
答案 0 :(得分:2)
实际上有一种方法可以在Array中定义to_proc,检查一下:
a = ['a', 'b', 'c']
class Array
def to_proc
proc { |receiver| receiver.send(self[0]) == self[1] }
end
end
p a.detect(&[:capitalize, 'B']) #=> 'b'
答案 1 :(得分:1)
此快捷方式
objects.map(&:attribute)
有效,因为&
在其参数上调用to_proc
,Symbol#to_proc
看起来像这样:
def to_proc
proc { |x| x.send(self) }
end
所以它相当于
objects.map(&proc { |x| x.send(:attribute) }) # which is the same as
objects.map { |x| x.attribute }
因此,如果您想简化以下代码
objects.detect { |object| object.attribute == x }
你需要to_proc
给你的某种对象
proc { |x| x.send(attr) == val }
不幸的是,Ruby中没有内置to_proc
方法,但您可以自由地定义自己的daremkd指出。