![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| pavels |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 26.9.2010 Репутация: нет Всего: нет |
Кто знает как из вызываемой ф-ии узнать каким образом она была вызвана
Package::function('Package') или Package->function() ? Спасибо! |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
$_[0]
|
|||
|
||||
| pavels |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 26.9.2010 Репутация: нет Всего: нет |
Таким образом я получаю строку 'Package', вопрос каким образом функция вызвалась (через :: или ->) |
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Если $_[0] равно имени пакета то вызвана как ->
|
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
$_[0] в обоих случаях будет равно 'Package'. В обычно определять как вызывалася функция, через -> или как обычная не нужно, т. к. Perl допускает оба способа вызова. Когда-то видел на CPAN модуль, позволяющий определить сабж.
|
|||
|
||||
| KSURi |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Как сделать это в общем случае не знаю, но здесь в первом случае будет два аргумента, во втором - один.
-------------------- Died at Life.pl line 21 |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
Между этими способами разница только в том, что во втором случае включается механизм наследования, а в первом нет. Поэтому стандартными средствами не определить. Но повторюсь, если не ошибаюсь, где-то видел модуль, это делающий.
|
|||
|
||||
| Jimy |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 4.7.2010 Репутация: нет Всего: 3 |
Здесь будет один аргумент в обоих случаях.
Смысла передавать название пакета в качестве аргумента не вижу поскольку его можно узнать внутри пакета в переменной __PACKAGE__. Определить, как был вызван метод можно анализируя первый аргумент. Во втором случае следующий код вернет истину:
Это сообщение отредактировал(а) Jimy - 27.9.2010, 15:22 |
||||||
|
|||||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
# perl -l =( cat )
package AA; use base "Exporter"; our @EXPORT = qw( aa ); sub aa ($$) { return sprintf "<%s> (%s) %s",__PACKAGE__, join ( ",",map { m#\D# ? "'$_'" : $_ } @_ ), join ",",caller (0); } package main; print "AA::aa (1,2) => ",AA::aa (1,2); print "AA->aa (1,2) => ",AA->aa (1,2); print "aa AA (1,2) => ",aa AA (1,2); ^D AA::aa (1,2) => <AA> (1,2) main,/tmp/zshcEGVK6,14,AA::aa,1,1,,,256,, AA->aa (1,2) => <AA> ('AA',1,2) main,/tmp/zshcEGVK6,15,AA::aa,1,1,,,256,, aa AA (1,2) => <AA> ('AA',1,2) main,/tmp/zshcEGVK6,16,AA::aa,1,1,,,256,, # |
|||
|
||||
| pavels |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 26.9.2010 Репутация: нет Всего: нет |
Спасибо всем, кто пытается помочь..
Я пытаюсь написать маленький модуль, для автозагрузки модулей (в проекте много модулей, имена пакетов которых совпадает с именами модулей) чтоб модуль подтягивался по запросу (вместо require Module; перед вызовом ф-ии) Известно, что логику можно посадить на UNIVERSAL::AUTOLOAD, которая запустится, если ф-ия не найдена, которая в свою очередь должна подгрузить модуль и запустить ф-ию из нее. Возможно, что вызываемая ф-ия является наследуемым методом базового класса, соответственно нужно вызывать как -> (например my $order = Order->new()), соответственно в UNIVERSAL::AUTOLOAD я должен различать способ вызова (через :: или ->). |
||||||||
|
|||||||||
| KSURi |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
О, точно. Не заметил, что второй вызов без аргументов был. Это сообщение отредактировал(а) KSURi - 27.9.2010, 23:07 -------------------- Died at Life.pl line 21 |
|||
|
||||
| Jimy |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 4.7.2010 Репутация: нет Всего: 3 |
Совершенно верно, и это говорит о том, что была статично вызвана функция пакета. А при вызове из объекта будет выполняться равенство
|
||||||
|
|||||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
Сегодня наткнулся на модуль, о котором говорил. Devel::Caller.
Кстати, проверка не работает под отладчиком, т.к. отладчик перехватывает вызовы функций, и вызывыет их самостоятельно. |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |