end

end

class Child < Parent

 def alpha

  puts 'alpha: потомок'

 end

 def beta

  puts 'beta: потомок'

 end

 remove_method :alpha # Удалить 'этот' alpha.

 undef_method :beta   # Удалить все beta.

end

x = Child.new

x.alpha               # alpha: родитель

x.beta                # Ошибка!

Метод remove_const удаляет константу.

module Math

remove_const :PI

 end

# PI больше нет!

Отметим, что таким способом можно удалить и определение класса (потому что идентификатор класса — это просто константа):

class BriefCandle

 #...

end

out_out = BriefCandle.new

class Object

 remove_const :BriefCandle

end

# Создать еще один экземпляр класса BriefCandle не получится!

# (Хотя out_out все еще существует...)

Такие методы, как remove_const и remove_method, являются закрытыми (что и понятно). Поэтому во всех примерах они вызываются изнутри определения класса или модуля, а не снаружи.

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

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату