加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 20:11:35 所属栏目:百科 来源:网络整理
导读:提出成语 我发现一个interesting but unexplained alternative被接受的答案.该代码在REPL中显然有效.例如: module Foo class Bar def baz end endendFoo.constants.map(Foo.method(:const_get)).grep(Class)= [Foo::Bar] 但是,我不完全明白这里使用的成语.
提出成语

我发现一个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,这不会被弄脏.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读