Шрифт:
А если имена вложены? Как выясняется, следующий код не работает:
Дело в том, что метод
Такой код встречается часто (и демонстрирует интересное применение
11.3.4. Получение и установка переменных экземпляра
Отвечая на пожелание употреблять
Прежде всего, отметим, что имя переменной должно начинаться со знака
Не нарушает ли существование таких методов принцип инкапсуляции? Нет. Конечно, эти методы потенциально опасны. Пользоваться ими следует с осторожностью, а не при всяком удобном случае. Но нельзя говорить, что инкапсуляция нарушена, не видя, как эти инструменты применяются в конкретном случае. Если это делается обдуманно, ради ясно осознанной цели, то все хорошо. Если же цель состоит в том, чтобы нарушить проект или обойти неудачное проектное решение, это печально. Ruby намеренно предоставляет доступ к внутренним деталям объектов тем, кому это действительно нужно; ответственный программист не станет пользоваться свободой во вред.
11.3.5. Метод define_method
Помимо ключевого слова
Конечно, в Ruby практически все происходит во время выполнения. Если окружить определение метода обращениями к
Но внутри тела метода или в другом аналогичном месте нельзя заново открыть класс (если только это не синглетный класс). В таком случае в прежних версиях Ruby приходилось прибегать к помощи
Первая (ошибочная) попытка воспользоваться этим методом могла бы выглядеть так:
Поскольку