Чтение онлайн

на главную - закладки

Жанры

Программирование на языке 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

Если

вы работаете с Ruby уже несколько лет, то заметите, что эти методы немного изменились. Теперь параметры по умолчанию равны
true
, а не
false
.

11.3.9. Просмотр стека вызовов

And you may ask yourself: Well, how did I get here? [13] Talking Heads, «Once in a Lifetime»

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), хотя наиболее популярная в данный момент библиотека такого рода этим средством не пользуется.

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

Люди и нелюди

Бубела Олег Николаевич
2. Везунчик
Фантастика:
фэнтези
попаданцы
9.18
рейтинг книги
Люди и нелюди

Студент из прошлого тысячелетия

Еслер Андрей
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Студент из прошлого тысячелетия

Петля, Кадетский корпус. Книга восьмая

Алексеев Евгений Артемович
8. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Петля, Кадетский корпус. Книга восьмая

Курсант поневоле

Шелег Дмитрий Витальевич
1. Кровь и лёд
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Курсант поневоле

Чужак из ниоткуда 3

Евтушенко Алексей Анатольевич
3. Чужак из ниоткуда
Фантастика:
космическая фантастика
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда 3

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Мы – Гордые часть 8

Машуков Тимур
8. Стальные яйца
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Мы – Гордые часть 8

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Князь Андер Арес 2

Грехов Тимофей
2. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Андер Арес 2

Рубежник

Билик Дмитрий Александрович
1. Бедовый
Фантастика:
юмористическая фантастика
городское фэнтези
мистика
5.00
рейтинг книги
Рубежник

Бестужев. Служба Государевой Безопасности. Книга третья

Измайлов Сергей
3. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга третья

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Личный аптекарь императора. Том 6

Карелин Сергей Витальевич
6. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Личный аптекарь императора. Том 6

Мрак

Мартовский Кот
Фантастика:
постапокалипсис
5.00
рейтинг книги
Мрак