Шрифт:
Можно было бы поступить так же внутри определения класса (в применении к классу
Есть еще один трюк: включить в класс метод, который сам вызывает
То же самое можно сделать и на уровне экземпляра, а не класса:
Здесь метод экземпляра тоже определен динамически. Изменился только способ реализации метода
По поводу метода
Смысл здесь в том, что новый метод может обращаться к переменным в исходной области видимости блока, хотя сама эта область более не существует и никаким другим способом не доступна. Иногда это бывает полезно, особенно в случае метапрограммирования или при разработке графических интерфейсов, когда нужно определить методы обратного вызова, реагирующие на события.
Отметим, что замыкание оказывается таковым только тогда, когда имя переменной то же самое. Изредка из-за этого могут возникать сложности. Ниже мы воспользовались методом
А теперь попробуем проделать с переменной экземпляра класса такой трюк:
Мы ожидали, что будет напечатано 999, а получили
С другой стороны, такой код работает правильно: