Книга: Программирование на языке Ruby
11.3.8. Получение списка определенных сущностей
11.3.8. Получение списка определенных сущностей
API отражения в Ruby позволяет опрашивать классы и объекты во время выполнения. Рассмотрим методы, имеющиеся для этой цели в Module
, Class
и Object
.
В модуле Module
есть метод constants, который возвращает массив всех констант, определенных в системе (включая имена классов и модулей). Метод nesting
возвращает массив всех вложенных модулей, видимых в данной точке программы.
Метод экземпляра Module#ancestors
возвращает массив всех предков указанного класса или модуля.
list = Array.ancestors
# [Array, Enumerable, Object, Kernel]
Метод constants
возвращает список всех констант, доступных в данном модуле. Включаются также его предки.
list = Math.constants # ["E", "PI"]
Метод class_variables
возвращает список всех переменных класса в данном классе и его суперклассах. Метод included_modules
возвращает список модулей, включенных в класс.
class Parent
@@var1 = nil
end
class Child < Parent
@@var2 = nil
end
list1 = Parent.class_variables # ["@@var1"]
list2 = Array.included_modules # [Enumerable, Kernel]
Методы instance_methods
и public_instance_methods
класса Class
— синонимы; они возвращают список открытых методов экземпляра, определенных в классе. Методы private_instance_methods
и protected_instance_methods
ведут себя аналогично. Любой из них принимает необязательный булевский параметр, по умолчанию равный true
; если его значение равно false
, то суперклассы не учитываются, так что список получается меньше.
n1 = Array.instance_methods.size # 121
n2 = Array.public_instance_methods.size # 121
n3 = Array.private_instance_methods.size # 71
n4 = Array.protected_instance_methods.size # 0
n5 = Array.public_instance_methods(false).size # 71
В классе Object
есть аналогичные методы, применяющиеся к экземплярам (листинг 11.17). Метод methods
возвращает список всех методов, которые можно вызывать для данного объекта. Метод public_methods
возвращает список открытых методов и принимает параметр, равный по умолчанию true
, который говорит, нужно ли включать также методы суперклассов. Методы private_methods
, protected_methods
и singleton_methods
тоже принимают такой параметр.
Листинг 11.17. Отражение и переменные экземпляра
class SomeClass
def initialize
@a = 1
@b = 2
end
def mymeth
# ...
end
protected :mymeth
end
x = SomeClass.new
def
x.newmeth
# ...
end
iv = x.instance_variables # ["@b", "@a"]
p x.methods.size # 42
p x.public_methods.size # 41
p x.public_methods(false).size # 1
p x.private_methods.size # 71
p x.private_methods(false).size # 1
p x.protected_methods.size # 1
p x.singleton_methods.size # 1
Если вы работаете с Ruby уже несколько лет, то заметите, что эти методы немного изменились. Теперь параметры по умолчанию равны true
, а не false
.
- 11.3.1. Динамическая интерпретация кода
- 11.3.2. Метод const_get
- 11.3.3. Динамическое создание экземпляра класса, заданного своим именем
- 11.3.4. Получение и установка переменных экземпляра
- 11.3.5. Метод define_method
- 11.3.6. Метод const_missing
- 11.3.7. Удаление определений
- 11.3.8. Получение списка определенных сущностей
- 11.3.9. Просмотр стека вызовов
- 11.3.10. Мониторинг выполнения программы
- 11.3.11. Обход пространства объектов
- 11.3.12. Обработка вызовов несуществующих методов
- 11.3.13. Отслеживание изменений в определении класса или объекта
- 11.3.14. Определение чистильщиков для объектов
- Получение статистики
- Получение помощи
- Получение помощи по работе с книгой и компакт-диском
- Получение помощи по Windows SharePoint Services 3.0
- Создание списка
- Добавление, изменение и удаление элементов списка
- Восстановление элементов списка из Корзины
- Добавление, изменение и удаление столбцов списка
- Сортировка и фильтрация списка
- Добавление и изменение представления списка
- Удаление списка
- Добавление списка необходимых предметов