Ruby:常量查找在instance_eval/class_eval 中如何工作?

2023-12-13

我正在研究 Pickaxe 1.9,并且对 instance/class_eval 块中的常量查找感到有点困惑。我用的是1.9.2。

Ruby 似乎以与方法查找相同的方式处理 *_eval 块中的常量查找:

  1. 在receiver.singleton_class(加上mixins)中查找定义;
  2. 然后在receiver.singleton_class.superclass(加上mixins)中;
  3. 然后继续沿着特征链向上直到你到达#<Class:BasicObject>;
  4. 其超类是 Class;
  5. 然后沿着祖先链的其余部分(包括Object,它存储您在顶层定义的所有常量),一路检查 mixins

它是否正确?镐的讨论有点简洁。

一些例子:

class Foo
  CONST = 'Foo::CONST'
  class << self
    CONST = 'EigenFoo::CONST'
  end
end

Foo.instance_eval { CONST } # => 'EigenFoo::CONST'
Foo.class_eval { CONST } # => 'EigenFoo::CONST', not 'Foo::CONST'!
Foo.new.instance_eval { CONST } # => 'Foo::CONST'

在 class_eval 示例中,Foo-the-class 并不是 Foo-the-object 的祖先链上的停止点!

还有一个 mixins 的例子:

module M
  CONST = "M::CONST"
end
module N
  CONST = "N::CONST"
end

class A
  include M
  extend N
end

A.instance_eval { CONST } # => "N::CONST", because N is mixed into A's eigenclass
A.class_eval { CONST } # => "N::CONST", ditto
A.new.instance_eval { CONST } # => "M::CONST", because A.new.class, A, mixes in M

在 1.9.2 中,常量查找发生了变化again相当于 1.8.7 行为。

class A
  class B
    class C
    end
  end
end

A.class_eval { B } # => NameError
A.instance_eval { B } # => NameError
A.new.instance_eval { B } # => A::B

基本上,常量是准词法范围的。这在 1.9.x 和 1.8.x 分支之间曾经是不同的,这使得库交叉兼容性变得很痛苦,所以他们把它改回来了。

Yehuda Katz(成功)呼吁恢复 1.8 行为

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

Ruby:常量查找在instance_eval/class_eval 中如何工作? 的相关文章

随机推荐

  • 尝试在 React 中导入组件时出现问题

    我在尝试使用 React 导入组件时遇到问题 app js 1 Uncaught ReferenceError 未定义 require 于 5 12 在我 babel min js 24 在 r babel min js 24 在 e sr
  • 在 Windows 7 上安装 Python 并分发会出现“写入失败...权限被拒绝”

    我使用的是 Windows 7 我完全承认我不了解其权限模型 我正在其他选项卡中阅读相关内容 我的用户是管理员 当我尝试运行 python allocate setup py 时 出现 写入失败 权限被拒绝 错误 然后出现 错误 无法在安装
  • 调用并行化 foreach 时出现问题

    我在使用 System Threading Tasks Parallel ForEach 时遇到问题 每个要更新的进度条的主体 但Invoke方法有时会冻结 我将代码附加到进度条和按钮的表单中 private void button1 Cl
  • 如何显示MySQL中未完成的事务

    我做了一些没有提交的查询 然后应用程序被停止 如何显示这些未结交易并提交或取消它们 如何显示这些未结交易并提交或取消它们 没有打开的事务 MySQL 将在断开连接时回滚事务 您无法提交事务 IFAIK 您使用显示线程 SHOW FULL P
  • C# 中根据空格分割字符串

    我有一个字符串 dexter 是好是坏 我想通过根据空格分割该字符串来创建一个列表 我使用以下代码实现了这一点 string ss dexter is good annd bad var s string IsNullOrEmpty ss
  • 从 Nunit 获取失败测试列表

    我有一个包含超过 8000 个测试的测试套件 并且很难看出哪些测试在代码更改之间中断 这些测试用例是从某些日志文件中自动提取的查询 有没有一种简单的方法来获取 NUnit 运行的失败测试列表 理想情况下 我想比较运行之间哪些测试受到影响 您
  • Protobuf-net 对 Dictionary/KeyValuePair 的支持是如何工作的?

    我试图了解 protobuf net 的 Dictionary KeyValuePair 支持 我们希望使用底层二进制流和从 java 生成的 proto 文件 但生成的 proto 文件包含看起来像名为 Pair String Int32
  • iOS 应用程序捆绑包 ID 错误和 iTunesConnect

    如本文所述SO entry 我在 iOS 应用程序应用程序上传器中遇到错误 这些是我的价值观 在钥匙串中我有这个证书 iPhone Distribution ExampleCompany DistCertificateID 在我的devel
  • 获取Linux中每个进程的堆和堆栈的大小

    我想知道Linux中每个进程的堆和堆栈的大小 有什么办法可以找到吗 我发现 sbrk 0 会给我堆的结尾 但是如何找到堆的起始位置来获取堆大小呢 另外 关于堆栈大小 是否有任何方法可以通过任何库调用或系统调用找到每个进程的堆栈开头和当前堆栈
  • Spring 4 i18n & l10n(无法更改 HTTP 接受标头)

    我需要帮助来解决此错误消息 我正在使用 spring 4 我想在我的项目中实现 i18n 和 l10n 当我尝试更改语言时 会出现此消息 下面是我的代码 请问 有人可以帮我解决这个问题吗 https i stack imgur com tK
  • didReceiveData 未获取所有数据

    我正在尝试使用 NSURLConnection 下载 JSON 但除非我强制应用程序暂停几秒钟 否则我获得的数据并不完整 它总是在 2600 字节左右 而我的响应应该在 70000 左右 任何线索为什么会发生这种情况 谢谢 void con
  • 未检测到文档的语法约束(DTD 或 XML 模式)

    我有这个 dtd http fast code sourceforge net template dtd但是当我包含在 xml 中时 我收到警告 未检测到文档的语法约束 DTD 或 XML 模式 xml 是
  • 使用正则表达式捕获 html 标签内的内容

    首先 我知道这是一种不好的做法 我已经回答了很多问题 甚至这么说 但需要澄清一下我被迫使用正则表达式 因为该应用程序将正则表达式存储在数据库中并且只能以这种方式运行 我绝对不能改变功能 现在我们已经解决了这个问题 因为我总是使用 DOM 方
  • 无法使 PubNub WebRTC 教程正常工作

    我正在尝试按照 PubNub 教程构建我的第一个 WebRTC 应用程序 https www pubnub com blog 2015 08 25 webrtc video chat app in 20 lines of javascrip
  • 使用 FluentFTP 以最大值同时从 FTP 下载多个文件

    我想从 FTP 目录递归下载多个下载文件 为此我使用 FluentFTP 库 我的代码是这样的 private async Task downloadRecursively string src string dest FtpClient
  • 在本地使用 mpi 安装 fftw-2.1.5

    我正在尝试使用 enable mpi 标志在带有 linux 的 IBM 集群上安装 fftw 2 1 5 库 但此后我一直未能这样做 我需要 fftw 版本 2 1 5 因为 GADGET2 代码需要该版本 并且具有 mpi 支持 首先
  • Python - BeautifulSoup html解析处理gbk编码不佳 - 中文网页抓取问题

    我一直在修改以下脚本 coding utf8 import codecs from BeautifulSoup import BeautifulSoup NavigableString UnicodeDammit import urllib
  • 字典、哈希集的访问时间

    访问时间是多少 在字典中查找值 检查HashSet是否有值 是像C 0x的unordered map那样O 1 吗 是的 当您使用 Contains 方法或字典的索引器时 来自文档 Dictionary Of TKey TValue 泛型类
  • 我可以在 JavaScript 中将新数组重新分配给数组变量吗?

    我对 JavaScript 中的数组以及在函数内操作它们有疑问 这是书上的练习雄辩的 JavaScript 它涉及两个功能 reverseArray 返回一个new与参数数组相反的数组 reverseArrayInPlace 只是反转参数数
  • Ruby:常量查找在instance_eval/class_eval 中如何工作?

    我正在研究 Pickaxe 1 9 并且对 instance class eval 块中的常量查找感到有点困惑 我用的是1 9 2 Ruby 似乎以与方法查找相同的方式处理 eval 块中的常量查找 在receiver singleton