Я пытался получить главу метапрограммирования Matz и Flanagan "Язык программирования Ruby" в моей голове. Однако я не мог понять результат из следующего фрагмента кода, о котором я мечтал:
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
).
Я пытался получить список констант, определенных для класса модуля, когда я столкнулся с этим странным поведением.
A
константы отображаются в Module.constants. Как получить список констант, определенных классом модуля?
docs state
Module.constants
возвращает все константы, определенные в системе. включая имена всех классов и методов
Так как A
наследует свою реализацию от Module.constants
, как он ведет себя по-разному в базовом и производном типах?
p A.class # => Class
p A.class.ancestors # => [Class, Module, Object, Kernel]
Примечание. Если вы используете Ruby 1.9, constants
вернет массив символов вместо строк.