11.3.3. Динамическое создание экземпляра класса, заданного своим именем
11.3.3. Динамическое создание экземпляра класса, заданного своим именем
Такой вопрос мы видели многократно. Пусть дана строка, содержащая имя класса; как можно создать экземпляр этого класса?
Правильный способ — воспользоваться методом const_get, который мы только что рассмотрели. Имена всех классов в Ruby — константы в «глобальном» пространстве имен, то есть члены класса Object.
classname = "Array"
klass = Object.const_get(classname)
x = klass.new(4, 1) # [1, 1, 1, 1]
А если имена вложены? Как выясняется, следующий код не работает:
class Alpha
class Beta
class Gamma
FOOBAR =237
end
end
end
str = "Alpha::Beta::Gamma::FOOBAR"
val = Object.const_get(str) # Ошибка!
Дело в том, что метод const_get недостаточно «умен», чтобы распознать такие вложенные имена. Впрочем, в следующем примере приведена работающая идиома:
# Структура класса та же
str = "Alpha::Beta::Gamma::FOOBAR"
val = str.split("::").inject(Object) {|x,y| x.const_get(y) } # 237
Такой код встречается часто (и демонстрирует интересное применение inject).
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Вход на форум под своим именем
Вход на форум под своим именем Далее заходим на главную страницу форума и видим справа вверху окошко, куда вводим свой логин и пароль (указанный при регистрации). Нажимаем кнопку «Вход».Все!Р.S. Для того чтобы каждый раз при входе на форум не вводить свой логин и пароль,
11.1.2. Создание атрибутов экземпляра
11.1.2. Создание атрибутов экземпляра Имени атрибута экземпляра в Ruby всегда предшествует знак @. Это обычная переменная в том смысле, что она начинает существовать после первого присваивания.В ОО-языках часто создаются методы для доступа к атрибутам, чтобы обеспечить
11.1.4. Создание атрибутов и методов уровня класса
11.1.4. Создание атрибутов и методов уровня класса Метод или атрибут не всегда ассоциируются с конкретным экземпляром класса, они могут принадлежать самому классу. Типичным примером метода класса может служить new, он вызывается для создания новых экземпляров, а потому не
8.10. Создание интерфейса с помощью абстрактного базового класса
8.10. Создание интерфейса с помощью абстрактного базового класса ПроблемаТребуется определить интерфейс, который будет реализовываться производными классами, но концепция этого интерфейса является абстракцией и не должна наследоваться сама по себе.РешениеСоздайте
10.5. Создание класса, считываемого из потока
10.5. Создание класса, считываемого из потока ПроблемаВ поток записан объект некоторого класса и теперь требуется считать эти данные из потока и использовать их для инициализации объекта того же самого класса.РешениеИспользуйте operator>> для чтения данных из потока в ваш
11.4. Фильтрация значений, выпадающих из заданного диапазона
11.4. Фильтрация значений, выпадающих из заданного диапазона ПроблемаТребуется проигнорировать содержащиеся в последовательности значения, которые располагаются ниже или выше заданного диапазона.РешениеИспользуйте функцию remove_copy_if, определенную в <algorithm>, как
8.4.1. Динамическое создание и уничтожение единичных объектов
8.4.1. Динамическое создание и уничтожение единичных объектов Оператор new состоит их ключевого слова new, за которым следует спецификатор типа. Этот спецификатор может относиться к встроенным типам или к типам классов. Например:new int;размещает в хипе один объект типа int.
8.4.3. Динамическое создание и уничтожение массивов
8.4.3. Динамическое создание и уничтожение массивов Оператор new может выделить из хипа память для размещения массива. В этом случае после спецификатора типа в квадратных скобках указывается размер массива. Он может быть задан сколь угодно сложным выражением. new
8.4.4. Динамическое создание и уничтожение константных объектов
8.4.4. Динамическое создание и уничтожение константных объектов Программист способен создать объект в хипе и запретить изменение его значения после инициализации. Этого можно достичь, объявляя объект константным. Для этого применяется следующая форма оператора new:const int
Создание нового класса
Создание нового класса Из любой страницы ClassWizard можно добавить в приложение новый класс, созданный на основе базовых классов. В качестве базового класса можно использовать классы, наследованные от класса CCmdTarget или класса CRecordset . Если требуется создать класс, не
Динамическое создание и повторное связывание
Динамическое создание и повторное связывание Что не было показано при описании структуры объектов периода выполнения, так это в высшей степени динамичная природа настоящей ОО-модели. Статическая и ориентированная на стеки политика управления объектами характерна для
Владеете ли вы своим именем?
Владеете ли вы своим именем? Рэм Аврахами [Ram Avrahami] считал, что он владеет собственным именем, но на самом деле его именем владела частная компания с 500 служащими и стоимостью 310 миллионов долларов. Аврахами обратился в суд, чтобы остановить практику компании по продаже его