提出成语
我发现一个interesting but unexplained alternative被接受的答案.该代码在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返回一个模块常量数组作为符号.@H_404_13@>方法(:const_get)使用Object#method执行方法查找并返回一个闭包.@H_404_13@> Foo.method(:const_get).call:Bar是一个闭包,它将一个合格的路径返回给类中的一个常量.@H_404_13@>& Foo似乎是some sort of special lambda.文档说:
The & argument preserves the tricks if a Proc object is given by & argument.
我不知道我完全明白这个特定背景下的意思.为什么是Proc?什么“技巧”,为什么在这里呢?@H_404_13@> grep(Class)正在运行的#map method的值,但其功能并不明显.
>为什么#map结构返回一个greppable数组而不是枚举器?
Foo.constants.map(&Foo.method(:const_get)).class => Array
>如何为一个名为Class的类实际工作,为什么这个特殊的建筑在这里呢?
[Foo::Bar].grep Class => [Foo::Bar]
问题重述
我真的很想理解这个成语.任何人都可以填写这里的空白,并解释这些作品如何融合在一起?