Array.find方法问题

时间:2009-01-21 16:49:26

标签: ruby

我在ZenTest源代码中找到了这一行:

result = @test_mappings.find { |file_re, ignored| filename =~ file_re }

这里的@test_mappingsresult都是Array对象,但我没有在ruby doc的Array类中找到'find'方法。我也尝试过irb:

irb(main):014:0> Array.respond_to? :find
=> false
irb(main):015:0> [1,2,3].find
LocalJumpError: no block given
        from (irb):15:in `find'
        from (irb):15:in `each'
        from (irb):15:in `find'
        from (irb):15
irb(main):016:0> [1,2,3].find{|x| x>1}
=> 2

有人可以向我解释一下吗?怎么能找到方法也返回一个Array对象?提前谢谢。

2 个答案:

答案 0 :(得分:8)

Array包含Enumerable模块,该模块添加了find方法。

在您的示例中,您测试了Array.respond_to。这仅对Array的类方法返回true。 find是一个实例方法,因此必须在类的实例上调用respond_to?

>> a = Array.new
=> []
>> a.respond_to? :find
=> true

答案 1 :(得分:2)

另一个有时有用的技巧是调用'methods'函数,该函数列出了对象实例可用的所有方法,并使用grep方法过滤掉特定的东西。它还可以让您很好地了解基类提供的标准方法,而无需参考文档。

a = Array.new
=> []
>> a.methods.grep /find/
=> ["find", "find_all"]