Проблема метода Array.find

Я нахожу эту строку в исходном коде ZenTest:

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

@test_mappings и result здесь оба являются объектами Array, но я не нашел метода find для класса Array в ruby ​​doc. Еще пробовал на 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

Может ли кто-нибудь мне это объяснить? Как мог метод find также возвращать объект Array? заранее спасибо.

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
2
0
4 271
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Array включает модуль Enumerable, который добавляет метод find.

В вашем примере вы тестировали Array.respond_to. Это вернет истину только для методов класса Array. find - это метод экземпляра, поэтому respond_to? необходимо вызывать в экземпляре класса.

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

Если вы не хотите создавать экземпляр, чтобы посмотреть, будет ли он на что-то отвечать, вы можете написать Array.instance_methods.include? (: Find)

Chuck 21.01.2009 22:32

Хорошее замечание, Чак. (Хотя вы должны использовать строку, а не символ, например, "найти")

Gordon Wilson 22.01.2009 00:25

@Gordon, мне интересно, есть ли способ позволить мне узнать, из какого класса был инициирован вызов метода, например, как в этом случае, чтобы вернуть Enumerable для вызова метода "find".

eric2323223 22.01.2009 05:41

@eric, хороший вопрос. Я даже не знаю ответа. Но я бы хотел. Хотите задать вопрос? Бьюсь об заклад, кто-то здесь может объяснить это нам обоим.

Gordon Wilson 22.01.2009 06:03

Другой иногда полезный трюк - это вызов функции «методы», которая перечисляет все методы, доступные экземпляру объекта, и использование метода grep для фильтрации чего-то конкретного. Это также дает вам хорошее представление о том, какие стандартные методы предоставляются базовыми классами, не обращаясь к документации.

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

Другие вопросы по теме