Программирование на языке Ruby
Шрифт:
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
@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
Если
true
, а не false
. 11.3.9. Просмотр стека вызовов
And you may ask yourself: Well, how did I get here? [13]
13
Иногда необходимо знать, кто вызвал метод. Эта информация полезна, если, например, произошло неисправимое исключение. Метод
caller
, определенный в модуле Kernel
, дает ответ на этот вопрос. Он возвращает массив строк, в котором первый элемент соответствует вызвавшему методу, следующий — методу, вызвавшему этот метод, и т.д.
def func1
puts caller[0]
end
def func2
func1
end
func2 # Печатается: somefile.rb:6:in 'func2'
Строка имеет формат «файл;строка» или «файл;строка в методе».
11.3.10. Мониторинг выполнения программы
Программа на Ruby может следить за собственным выполнением. У этой возможности есть много применений; интересующийся читатель может заглянуть в исходные тексты программ
debug.rb
, profile.rb
и tracer.rb
. С ее помощью можно даже создать библиотеку для «проектирования по контракту» (design-by-contract, DBC), хотя наиболее популярная в данный момент библиотека такого рода этим средством не пользуется.
Поделиться:
Популярные книги
"Зарубежная фантастика 2024-4" Цикл "Люди льда". Компиляция. Книги 1-23
Зарубежная фантастика 2024
Фантастика:
фэнтези
5.00
рейтинг книги
Дважды одарённый. Том X
10. Дважды одаренный
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Точка Бифуркации
1. ТБ
Фантастика:
боевая фантастика
7.33
рейтинг книги
Философия. Книга вторая. Просветление экзистенции
Научно-образовательная:
философия
5.00
рейтинг книги
Паладин. (Трилогия)
Паладин
Фантастика:
фэнтези
юмористическая фантастика
8.89
рейтинг книги
Петлистые времена(Повести. Рассказы)
Фантастика:
научная фантастика
5.00
рейтинг книги
Игра
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Старый знакомый
Детективы:
прочие детективы
7.43
рейтинг книги
Стрелок. Извлечение троих. Бесплодные земли
Фантастика:
фэнтези
5.00
рейтинг книги
Гримуар темного лорда IV
4. Гримуар темного лорда
Фантастика:
фэнтези
боевая фантастика
попаданцы
аниме
5.25
рейтинг книги
Кодекс Охотника. Книга XXL
41. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Светила
Проза:
историческая проза
7.58
рейтинг книги
Собрание сочинений. т.3.
Проза:
классическая проза
5.00
рейтинг книги
Корабль смерти, Стальной человек и другие самые невероятные истории (сборник)
Шедевры фантастики
Фантастика:
научная фантастика
ужасы и мистика
6.80