ruby – 在内省模块类时,“#map(&proc)”成语如何工作?
提出成语
我发现一个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返回一个模块常量数组作为符号.
我不知道我完全明白这个特定背景下的意思.为什么是Proc?什么“技巧”,为什么在这里呢? >为什么#map结构返回一个greppable数组而不是枚举器? Foo.constants.map(&Foo.method(:const_get)).class => Array >如何为一个名为Class的类实际工作,为什么这个特殊的建筑在这里呢? [Foo::Bar].grep Class => [Foo::Bar] 问题重述 我真的很想理解这个成语.任何人都可以填写这里的空白,并解释这些作品如何融合在一起? 解决方法
& Foo.method(:const_get)是Foo对象的方法const_get.这是另一个例子:
m = 1.method(:+) #=> #<Method: Fixnum#+> m.call(1) #=> 2 (1..3).map(&m) #=> [2,3,4] 所以最后这只是一个pointfree的方式说Foo.constants.map {| c | Foo.const_get(c)}. grep使用===选择元素,所以它只会获得引用类的常量,而不是其他值.这可以通过向Foo添加另一个常数来验证,例如. Baz = 1,这不会被弄脏. 如果您有其他问题,请将其添加为评论,我将尝试澄清. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |