ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
11.7. Применение замыканий вместо объектовПроблемаВы хотите работать с записями, обладающими определенным состоянием, поведением и идентичностью, но вам не хочется изучать для этого объектно-ориентированное программирование.РешениеНапишите функцию, которая возвращает (по ссылке) хэш ссылок на фрагменты кода. Все эти фрагменты представляют собой замыкания, созданные в общей области действия, поэтому при выполнении они будут совместно использовать одни и те же закрытые переменные.КомментарийПоскольку замыкание представляет собой совокупность кода и данных, одна из реализации позволяет имитировать поведение объекта. Следующий пример создает и возвращает хэш анонимных функций. Функция mkcounter получает начальное значение счетчика и возвращает ссылку, позволяющую косвенно оперировать им.
$bundle->{"LAST"}=$bundle->{"PREV"};
> Смотри также -------------------------------
11.8. Создание ссылок на методыПроблемаТребуется сохранить ссылку на метод.РешениеСоздайте замыкание, обеспечивающее вызов нужного метода для объекта.КомментарийСсылка на метод - это нечто большее, чем простой указатель на функцию. Вам также придется определить, для какого объекта вызывается метод, поскольку исходные данные для работы метода содержатся в объекте. Оптимальным решением будет использование замыкания. Если переменная $obj имеет лексическую область действия, воспользуйтесь следующим фрагментом:$mref = sub { $obj->meth(@_) }; # Позднее... $mref->("args", "go", "here"); Даже когда переменная $obj выходит из области действия, она остается в замыкании, хранящемся в Smref. Позднее при косвенном вызове метода будет использован правильный объект. Учтите, что формулировка: $sref = \$obj->meth; работает не так, как можно предположить. Сначала она вызывает метод объекта, а затем дает ссылку либо на возвращаемое значение, либо на последнее из возвращаемых значений, если метод возвращает список. Метод can из базового класса UNIVERSAL выглядит заманчиво, но вряд ли делает именно то, что вы хотите: $cref = $obj->can("meth"); Он дает ссылку на код соответствующего метода (если он будет найден), не несущую информации об объекте. В сущности, вы получаете обычный указатель на функцию. Информация об объекте теряется. Из-за этого и понадобилось замыкание, запоминающее как состояние объекта, так и вызываемый метод. > Смотри также -------------------------------
|