ruby中object.attr == x的快捷方式?

时间:2015-02-04 14:26:44

标签: ruby

在ruby中,我可以使用以下快捷方式来映射对象属性:

objects.map(&:attribute)

与:

相同
objects.map { |object| object.attribute }

是否有类似的快捷方式,我找到属性等于x的第一个对象?

def find_first_with_matching_attribute(x)
  objects.detect { |object| object.attribute == x }
end

2 个答案:

答案 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_procSymbol#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指出。