Ruby 中 const_get 的行为令人困惑?

2024-04-24

根据文档mod.const_get(sym)“返回 mod 中指定常量的值。”

我也知道const_get默认情况下可以查找接收者的继承链。所以以下工作:

class A; HELLO = :hello; end
class B < A; end
B.const_get(:HELLO) #=> :hello

我也知道 Ruby 子类中的类Object,这样你就可以使用const_get即使接收者是普通类,也要查找“全局”常量:

class C; end
C.const_get(:Array) #=> Array

然而,这就是我感到困惑的地方——模块不会子类化Object。那么为什么我仍然可以使用以下命令从模块中查找“全局”常量const_get?为什么下面的方法有效?

module M; end
M.const_get(:Array) #=> Array

如果文档正确 -const_get只需查找接收者或其超类下定义的常量即可。但在上面的代码中,Object不是一个超类M,那么为什么可以查找Array ?

Thanks


你感到困惑是正确的......该文档没有说明 Ruby 为查找常量提供了特殊情况Modules并已修改明确说明这一点 http://ruby-doc.org/core-1.9.3/Module.html#const_get-method。如果在正常层次结构中没有找到该常量,Ruby 会从以下位置重新开始查找:Object,可以是在源码中找到 http://github.com/ruby/ruby/blob/v1_9_2_preview3/variable.c#L1594.

持续查找本身可能会有点令人困惑。举个例子:

module M
  Foo = :bar
  module N
    # Accessing Foo here is fine:
    p Foo # => bar
  end
end
module M::N
  # Accessing Foo here isn't
  p Foo  # => uninitialized constant M::N::Foo
end
p M::N.const_get :Foo  # => uninitialized constant M::N::Foo

不过,在这两个地方都可以访问Object电平常数如Array很好(感谢上帝!)。发生的事情是 Ruby 维护了一个“打开的模块定义”列表。如果常量有明确的作用域,比如LookHereOnly::Foo, then only LookHereOnly及其包含的模块将被搜索。如果没有指定范围(例如Foo在上面的示例中),Ruby 将查找打开的模块定义以查找常量Foo: M::N, then M最后Object。最顶层打开的模块定义始终是Object.

So M::N.const_get :Foo相当于访问Foo当开设的课程只有M::N and Object,就像我示例的最后一部分一样。

我希望我做对了,因为我自己仍然对不断的查找感到困惑:-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby 中 const_get 的行为令人困惑? 的相关文章

  • Ruby 试图掌握一种新的表示法。 (inject(:) 与 select(and:even?);为什么有 &?)

    所以 我刚刚了解到 而不是写这样的东西 1 2 3 4 5 inject x y x y gt 15 我可以写 1 2 3 4 5 inject gt 15 我还了解到 而不是写 1 2 3 4 5 select x x even gt 2
  • Rails 删除方法不起作用

    好吧 我在 Ruby on Rails 中的删除方法上遇到了这样的问题 我想 我尝试了我读过的所有内容 但它不起作用 也许你可以帮助解决这个问题 当我单击链接时 它会重定向到患者 1 confirm Are you sure 3F meth
  • 用 ruby​​ 中的数组内容替换字符串?

    String Test string Test array link1 link2 如何替换这样的字符串 输出应该是String link1 string link2 字符串 gsub 可以返回一个枚举器 所以这很简单 string gsu
  • 输出到控制台,同时保留 ruby​​ 中的用户输入

    我有一个 ruby 脚本 它同时异步接收和显示来自服务器的消息 并允许用户在控制台上输入 当收到消息时 当前正在将其写入用户正在键入的内容的中间 输入本身并没有乱码 但看起来很糟糕 理想情况下 它将保存用户当前的输入 输出消息 然后在下一行
  • Rails 返回 JSON 序列化属性 with_in Different_access

    我以前有 serialize params JSON 但这会返回 JSON 并将哈希键符号转换为字符串 我想使用符号引用哈希 这在使用哈希时最常见 我向它提供符号 Rails 返回字符串 为了避免这种情况 我创建了自己的 getter se
  • 可以在哈希每个循环中访问索引吗?

    我可能遗漏了一些明显的东西 但是有没有办法访问哈希每个循环内迭代的索引 计数 hash three gt one four gt two one gt three hash each key value any way to know wh
  • 从 ActiveRecord 获取表名

    I used ActiveRecord Base set table name在动态创建的 ActiveRecord 类上设置我的表名称 现在我需要知道稍后如何获得该值 api 文档没有提及如何执行此操作 另外 我无法从 ActiveRec
  • 如何使用 watir 滚动网页

    我正在尝试滚动网页以查找并单击页面滚动时延迟加载的内容 我正在使用以下命令 require watir webdriver browser Watir new firefox browser send keys space 我在 Firef
  • 如何检查水豚中的复选框?

    我正在使用 Rspec 和水豚 我怎样才能写一个步骤来检查checkbox 我试过了check按价值但它找不到我的checkbox 我不知道该怎么做 因为我实际上有相同的 ID 但值不同 这是代码
  • 如何让 Sinatra 通过 HTTPS/SSL 工作?

    正如标题所示 谷歌没有提供任何与此相关的有用信息 如何为 Sinatra 应用程序设置和配置 HTTPS SSL 如何创建 HTTPS 路由 我以前从未在我的应用程序中使用过 HTTPS 也没有调整 Rack 其他内容的经验 所以我很欣赏详
  • 使用 Ruby 获取 AWS 区域名称

    我正在为 AWS 开发 Rails 应用程序 并希望为区域名称创建下拉菜单 例如 us east 1 等 如果有人已经创建了 gem 来获取它们 我想使用它 有人知道这样的 gem 或有用的 API 吗 适用于 Ruby 的 AWS 开发工
  • 无需别名的 Ruby YAML 编写

    我正在从 ruby 将数据写入 yaml 文件 并且经常在该文件上添加别名 像 id001 somekey somevalue id001 就我而言 我使用 yaml 文件来aid可读性并将名称添加到文件中的值 因为现有数据只是 没有键的分
  • Capybara 的 has_selector 有哪些选项?

    我在 RSpec 中遇到此错误 有没有任何文档have selector解释了选项哈希中的每个键以及它到底有什么作用 invalid keys content should be one of text visible between co
  • ruby 的 String .hash 方法如何工作?

    我只是红宝石的新手 我见过一个字符串方法 String hash 例如 在irb 我试过了 gt gt mgpyone hash returns gt 144611910 这个方法是如何工作的 The hash方法是为所有对象定义的 看文档
  • Ruby mp3 Id3 解析

    目前我正在从事一个音乐项目 处理用户 mp3 上传 问题是我找不到适用于所有文件的 id3 库 我努力了id3 ruby and Mp3Info库 但它们都没有给我一致正确的结果 例如 最常见的问题 错误的流参数 比特率和采样率 有时是持续
  • 什么是 - 获取的是一个目录 - 错误消息

    我收到这个奇怪的错误 Users gideon Documents ca ruby rubytactoe lib player rb 13 in gets Is a directory spec Errno EISDIR 玩家规格 rb r
  • 有没有可以在 HTML 文档之间进行比较的 ruby​​ gem?

    事实证明 对两个不同的 html 文档进行比较是一个完全不同的问题 而不仅仅是对纯文本进行比较 例如 如果我在以下之间进行简单的 LCS 差异 Google and Google diff 结果不是 but a gt github com
  • 回形针不支持 .doc 文件

    在 Rails 4 0 2 中 我使用回形针 gem 上传文件 但它不支持 doc 文件 在文件上传字段下方 显示一条错误消息 扩展名与其内容不匹配 在模型中 检查内容类型的验证如下 validates attachment content
  • 在 Mac OS X 10.6.8 中手动编译 Ruby 时,GEM 在哪里?

    我在 Snow Leopard 上手动构建了 Ruby 1 9 2 现在我找不到我的旧 GEM 文件了 我猜他们现在正走在不同的道路上 所以我有三个问题 什么是 旧 宝石路径 在哪里gem install sinatra把西纳特拉宝石 当我
  • 为什么||和 或 在 Rails 中的行为有所不同? [复制]

    这个问题在这里已经有答案了 可能的重复 i true 和 false 在 Ruby 中是真的吗 https stackoverflow com questions 2802494 i true and false in ruby is tr

随机推荐