我试图理解Matz和Flanagan的“Ruby编程语言”元编程章节,但是我无法理解我构想的以下代码片段的输出:
注意:若使用 Ruby 1.9,则
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类定义的常量列表?
文档中指出:
Module.constants
返回系统中所有定义的常量,包括所有类名和方法名
由于A
继承自Module.constants
的实现方式,所以在基类和派生类型中如何表现不同?
p A.class # => Class
p A.class.ancestors # => [Class, Module, Object, Kernel]
注意:如果您正在使用Ruby 1.9,constants
会返回一个由符号组成的数组而不是字符串。
注意:若使用 Ruby 1.9,则
constants
回传之为符号(Symbol)组成的阵列而非字串(String)。