ruby – 在内省模块类时,“#map(&proc)”成语如何工作?

前端之家收集整理的这篇文章主要介绍了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返回一个模块常量数组作为符号.
>方法(:const_get)使用Object#method执行方法查找并返回一个闭包.
> Foo.method(:const_get).call:Bar是一个闭包,它将一个合格的路径返回给类中的一个常量.
>& Foo似乎是some sort of special lambda.文档说:

The & argument preserves the tricks if a Proc object is given by & argument.

我不知道我完全明白这个特定背景下的意思.为什么是Proc?什么“技巧”,为什么在这里呢?
> grep(Class)正在运行的#map method的值,但其功能并不明显.

>为什么#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,这不会被弄脏.

如果您有其他问题,请将其添加评论,我将尝试澄清.

猜你在找的Ruby相关文章