В Ruby <ClassName>.constants
полезен для проверки классов:
> Numeric.constants(false)
=> [:KILOBYTE, :MEGABYTE, :GIGABYTE, :TERABYTE, :PETABYTE, :EXABYTE]
> Object.constants(false)
=> [:Object, :Module, ...]
Это определено в Module
:
> Object.method(:constants)
=> #<Method: Class(Module)#constants>
Я хотел бы добавить другой метод для печати хэша со всеми константами и их значениями. Вот результат на данный момент:
def Module.constants_hash(inherit=true)
self.constants(inherit).inject({}) do |hash, constant|
hash[constant] = self::const_get(constant)
hash
end
end
Это работает для Module
(хотя оно не имеет констант, поэтому результатом является просто пустой хеш), но оно не наследуется :
> Object.constants_hash(false)
NoMethodError: undefined method `constants_hash' for Object:Class
from (pry):117:in `<main>'
Конечно, я могу изменить имя класса в коде, например. Object
для выполнения вызова, но возможно ли заставить все зависимые модули наследовать новый метод ? Другими словами, возможно ли добавить метод во время выполнения , который затем наследуется классами, которые require
модифицируют класс?
Я бы не стал перегружать исходный Module.constants
, чтобы избежать изменения API.