Вход/Регистрация
Программирование на языке Ruby
вернуться

Фултон Хэл

Шрифт:

Внутри определения класса можно уничтожать определения методов и констант в том же контексте, в котором они были определены. Нельзя применять

undef
внутри определения метода, а также к переменной экземпляра.

Существуют (определены в классе

Module
) также методы
remove_method
и
undef_method
. Разница между ними тонкая: remove_method удаляет текущее (или ближайшее) определение метода, a
undef_method
ко всему прочему удаляет его и из суперклассов, не оставляя от метода даже следа. Это различие иллюстрирует листинг 11.6.

Листинг 11.16. Методы remove_method и undef_method

class Parent

 def alpha

puts "alpha: родитель"

 end

 def beta

puts "beta: родитель"

 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
, то суперклассы не учитываются, так что список получается меньше.

  • Читать дальше
  • 1
  • ...
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: