【发布时间】:2011-01-19 12:53:28
【问题描述】:
我试图让 Matz 和 Flanagan 的“Ruby 编程语言”元编程章节进入我的脑海,但是我无法理解我梦想的以下代码 sn-p 的输出:
p Module.constants.length # => 88
$snapshot1 = Module.constants
class A
NAME=:abc
$snapshot2 = Module.constants
p $snapshot2.length # => 90
p $snapshot2 - $snapshot1 # => ["A", "NAME"]
end
p Module.constants.length # => 89
p Module.constants - $snapshot1 # => ["A"]
p A.constants # => ["NAME"]
本书指出类方法constants返回类的常量列表(正如您在A.constants的输出中看到的那样)。
当我遇到上述奇怪行为时,我试图获取为 Module 类定义的常量列表。
A 的常量显示在 Module.constants 中。如何获取 Module 类定义的常量列表?
docs 状态
Module.constants返回系统中定义的所有常量。包括所有类和方法的名称
由于A 继承自Module.constants 的实现,它在基类型和派生类型中的行为有何不同?
p A.class # => Class
p A.class.ancestors # => [Class, Module, Object, Kernel]
注意:如果您使用的是 Ruby 1.9,constants 将返回一个符号数组而不是字符串。
【问题讨论】:
-
我回答你的问题了吗?我之所以问,是因为我的回答未被“接受”,但没有要求提供任何其他信息...
-
@Marc - 你的回答让我想到了更多的问题、更多的涂鸦和擦除。这周花了我的时间试图解决方法解决方案......我仍然不清楚可能性是什么 - 但我认为我 90% 确定它是如何工作的。请参阅下面的帖子。
标签: ruby reflection metaprogramming