![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| ZibSoft |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 14.10.2006 Репутация: нет Всего: нет |
Не знаю как поточнее назвать тему.
В общем такая проблема: Есть класс один из методов которого отображается GUI. Для обработки событий GUI используются ссылка на подпрограмму. Например
Как в подпрограмме quit получить доступ к объекту? Т.е. $self. Функции обратного вызова планируется хранить в отдельном модуле и экспортировать в класс. |
|||
|
||||
| ZibSoft |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 14.10.2006 Репутация: нет Всего: нет |
Гоню.... не стоит писать посты когда спать охото
Ведь при вызове quit видим же и $self и $win. Так? |
|||
|
||||
| sir_nuf_nuf |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
нет, не так. Из close вы никогда (почти) не увидите лексические переменные другого блока (процедуры)
что бы при вызове quit было видно $self и $win нужно либо создать замыкание (closure)
либо сделать переменные локальными
Это сообщение отредактировал(а) sir_nuf_nuf - 7.9.2009, 11:21 |
||||
|
|||||
| ZibSoft |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 14.10.2006 Репутация: нет Всего: нет |
Если просто указать local $self, то интепретатор возмущается
Включена прагма strict. Если указать our $self, то в пакете где хранятся подпрограммы обратного вызова $self не видно :-(, там strict отключена иначе возмущается. А можно поподробнее про
про почти, что вы имели ввиду? P.S. Можно конечно не мучиться и использовать первый вариант, который
но код будет не красивый и работать с ним проблематично. Рисую меню и на каждый пункт меню свой обработчик, а меню большое... Может есть какие-то другие варианты решения? |
||||||
|
|||||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
под "почти" - имелся в виду XS извращения типа PadWalker. но это хак.
Объясните, зачем вам видеть переменные лексические переменные другой процедуры ? это вообще кошмарный прием - и ни разу не "красиво" Сделайте так - заведите у колбэков параметры и передавайте переменные через них (ну опять таки через замыкание)
Это, имхо, наиболее корректно. |
|||
|
||||
| ZibSoft |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 14.10.2006 Репутация: нет Всего: нет |
Сделаю, делаю как вы порекомендовали, через ссылки на анонимные подпрограммы.
Так проще. Спасибо |
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
Лучше посмотрите на последний вариант.
Он тоже через ссылки на анонимные процедуры (они называются замыканиями), но так код обработчиков будет у вас выделен в отдельные процедуры и может быть использован повторно. |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |