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, не хранятся в куче из соображений оптимизации.)
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
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 Отражение атак Обнаружение, изоляция и устранение инцидентов во многом напоминают обезвреживание взрывных устройств — чем быстрее и лучше вы это проделаете, тем меньший урон нанесет инцидент, связанный с безопасностью системы. Джин Шульц, главный