呈现成语
我找到了一个有趣但无法解释的替代已接受答案的方法。该代码在 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
似乎是某种特殊的 lambda。文档说:如果 Proc 对象由 & 参数给出,则 & 参数保留技巧。
我也不确定我是否完全理解在这种特定情况下这意味着什么。为什么是 Proc?什么“技巧”,为什么它们在这里是必要的?
grep(Class)
是对#map方法的值进行操作,但其特点并不明显。为什么这个 #map 构造返回一个 greppable 数组而不是一个枚举器?
Foo.constants.map(&Foo.method(:const_get)).class => Array
对名为 Class 的类的 grepping 是如何实际工作的,为什么这里需要这种特殊的构造?
[Foo::Bar].grep Class => [Foo::Bar]
问题,重述
我真的很想完整地理解这个成语。任何人都可以在这里填补空白,并解释这些部分是如何组合在一起的吗?