Представление Idiom
Я нашел интересную, но необъяснимую альтернативу принятому ответу. Код явно работает в REPL. Например:
module Foo
class Bar
def baz
end
end
end
Foo.constants.map(&Foo.method(:const_get)).grep(Class)
=> [Foo::Bar]
Однако я не полностью понимаю используемую здесь идиому. В частности, я не понимаю использование &Foo
, которое, похоже, является своего рода закрытием или как этот конкретный вызов #grep работает на результат.
Анализ идиомы
До сих пор я мог разбирать кусочки этого, но я не вижу, как все это сочетается. Вот что я думаю, что я понимаю пример кода.
-
Foo.constants
возвращает массив констант модуля в качестве символов. -
method(:const_get)
использует Object # method для выполнения поиска метода и возврата замыкания. -
Foo.method(:const_get).call :Bar
- это замыкание, которое возвращает квалифицированный путь к константе внутри класса. -
&Foo
кажется своего рода специальная лямбда. Документы говорят:Аргумент и аргумент сохраняют трюки, если объект Proc задается аргументом и аргументом.
Я не уверен, что полностью понимаю, что это значит в этом конкретном контексте. Почему Proc? Какие "трюки" и зачем они нужны здесь?
-
grep(Class)
работает над значением # map, но его функции не очевидны.-
Почему эта конструкция #map возвращает greppable Array вместо Enumerator?
Foo.constants.map(&Foo.method(:const_get)).class => Array
-
Как работает grepping для класса с именем Class, и зачем нужна эта конкретная конструкция здесь?
[Foo::Bar].grep Class => [Foo::Bar]
-
Вопрос, пересмотренный
Мне бы очень хотелось понять эту идиому в целом. Может ли кто-нибудь заполнить пробелы здесь и объяснить, как все элементы подходят друг к другу?