1.4.2. Отражение

1.4.2. Отражение

В языках Smalltalk, LISP и Java реализована (с разной степенью полноты) идея рефлексивного программирования — активная среда может опрашивать структуру объектов и расширять либо модифицировать их во время выполнения.

В языке Ruby имеется развитая поддержка отражения, но все же он не заходит так далеко, как Smalltalk, где даже управляющие конструкции являются объектами. В Ruby управляющие конструкции и блоки не представляют собой объекты. (Объект Proc можно использовать для того, чтобы представить блок в виде объекта, но управляющие конструкции объектами не бывают никогда.)

Для определения того, используется ли идентификатор с данным именем, служит ключевое слово defined? (обратите внимание на вопросительный знак в конце слова):

if defined? some_var

 puts "some_var = #{some_var}"

else

 puts "Переменная some_var неизвестна."

end

Аналогично метод respond_to? выясняет, может ли объект отвечать на вызов указанного метода (то есть определен ли данный метод для данного объекта). Метод respond_to? определен в классе Object.

В Ruby запрос информации о типе во время выполнения поддерживается очень полно. Тип или класс объекта можно определить, воспользовавшись методом type (из класса Object). Метод is_a? сообщает, принадлежит ли объект некоторому классу (включая и его суперклассы); синонимом служит имя kind_of?. Например:

puts "abc".class "" # Печатается String

puts 345.class # Печатается Fixnum

rover = Dog.new

print rover.class # Печатается Dog

if rover.is_a? Dog

 puts "Конечно, является."

end

if rover.kind_of? Dog

 puts "Да, все еще собака."

end

if rover.is_a? Animal

 puts "Да, он к тому же и животное."

end

Можно получить полный список всех методов, которые можно вызвать для данного объекта. Для этого предназначен метод methods из класса Object. Имеются также его варианты private_instance_methods, public_instance_methods и т.д.

Аналогично можно узнать, какие переменные класса или экземпляра ассоциированы с данным объектом. По самой природе ООП в перечни методов и переменных включаются те, что определены как в классе самого объекта, так и во всех его суперклассах. В классе Module имеется метод constants, позволяющий получить список всех констант, определенных в модуле.

В классе Module есть метод ancestors, возвращающий список модулей, включенных в данный модуль. В этот список входит и сам данный модуль, то есть список, возвращаемый вызовом Mod.ancestors, содержит по крайней мере элемент Mod. В этот список входят не только родительские классы (отобранные в силу наследования), но и «родительские» модули (отобранные в силу включения).

В классе Object есть метод superclass, который возвращает суперкласс объекта или nil. Не имеет суперкласса лишь класс Object, и, значит, только для него может быть возвращен nil.

Модуль ObjectSpace применяется для получения доступа к любому «живому» объекту. Метод _idtoref преобразует идентификатор объекта в ссылку на него; можно считать, что это операция, обратная той, что выполняет двоеточие в начале имени. В модуле ObjectSpace есть также итератор each_object, который перебирает все существующие в данный момент объекты, включая и те, о которых иным образом узнать невозможно. (Напомним, что некоторые неизменяемые объекты небольшого размера, например принадлежащие классам Fixnum, NilClass, TrueClass и FalseClass, не хранятся в куче из соображений оптимизации.)

Данный текст является ознакомительным фрагментом.



Поделитесь на страничке

Похожие главы из других книг:

9.4 Локальное и удаленное зеркальное отражение

Из книги автора

9.4 Локальное и удаленное зеркальное отражение Зеркальное отражение уже упоминалось в разделе 9.1, но подробно не рассматривалось. Зеркальное отражение представляет собой процесс создания дубликата доступных данных, что позволяет обеспечить доступность данных при


Отражение

Из книги автора

Отражение При работе с инструментом Отражение происходит зеркальное отражение пикселов, которые попали в область действия кисти. Лучше всего будет, если вы попробуете самостоятельно поэкспериментировать с данным инструментом и посмотрите, как он действует. Возможно,


Tile & Mirror (Мозаика и отражение)

Из книги автора

Tile & Mirror (Мозаика и отражение) В эту группу входят разнообразные искажающие эффекты, позволяющие по-разному отражать и масштабировать картинку. Например, можно создавать калейдоскопическое изображение разных типов (фильтры Kaleidoscope (Калейдоскоп)), эффекты смещения (XYOffsest


Урок № 91. Отражение зарплаты, причитающихся удержаний и налогов в учете

Из книги автора

Урок № 91. Отражение зарплаты, причитающихся удержаний и налогов в учете Чтобы данные о зарплате, а также о причитающихся налогах и удержаниях отразились в бухгалтерском и налоговом учете, необходимо сформировать и провести документ "Отражение зарплаты в


Зеркальное отражение

Из книги автора

Зеркальное отражение Если вы собираетесь создать зеркальное отражение трехмерного объекта относительно прямой, лежащей в плоскости XY, то по-прежнему можно воспользоваться командой MIRROR. В противном случае необходимо применить команду 3DMIRROR, создающую отражение объектов


Отражение атак

Из книги автора

Отражение атак Код Firebird 1.0.x содержит большое количество команд копирования строк, которые не проверяют длину копируемых данных. Некоторые из этих переполнений могут быть доступны для внешнего манипулирования путем передачи больших строк двоичных данных в операторах SQL


ГОЛУБЯТНЯ: Диалектика как отражение сезонных перемещений

Из книги автора

ГОЛУБЯТНЯ: Диалектика как отражение сезонных перемещений Автор: Сергей Голубицкий«Я почти ничего не понял. А главное – не понял, при чем тут компьютеры. Думаю, если бы этой статьи не было – мир бы не много потерял». Юзер «Рамзес» на форуме «Компьютерры» в адрес


14.8. Эффектное отражение в воде

Из книги автора

14.8. Эффектное отражение в воде Этот пример относится к классическим эффектам, реализуемым в Photoshop. Под этим понимается прежде всего то, что результат работы в данном случае известен. Особенно часто можно встретить спортивную машину, отражаемую в воде.Мы также пойдем по


Глава 1 Отражение атак

Из книги автора

Глава 1 Отражение атак Обнаружение, изоляция и устранение инцидентов во многом напоминают обезвреживание взрывных устройств — чем быстрее и лучше вы это проделаете, тем меньший урон нанесет инцидент, связанный с безопасностью системы. Джин Шульц, главный