![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Nab |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Вот затрудняюсь с таким вопросом...
Если мне в функцию передают ссылку, как универсально определить что она приведена к какому нибудь классу (пакету)? Я имею несколько вариантов, но они мне не очень нравиться... мож есть что получше, или пакет какой имеется? первый вариант таков:
можно еще проверять на принадлежность ссылки к известным типам, вот так примерно: Кстати я не уверен что перечислил все типы ссылок
но такой метод не сработает если найдется еще один тип который появиться в следующей версии, да и вообще не верно это... можно еще вот так:
но это тоже не самое элегантное решение Вот предлагайте свои варианты.... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||||
|
|||||||
| Zuzu |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
perldoc -f ref
Если ref() вернула что-то вразумительное и этого нет в списке - то ссылка приведена к пакету. Это сообщение отредактировал(а) Zuzu - 5.2.2007, 11:25 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
||||
|
|||||
| nitr |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Zuzu, имхо он указал такую возможность:
и почему не подходит Похоже вариант
более подходящий, но вот о скорости вопрос... Да и может такие модули помогут Class::Inspector Class::ISA Я лично воспользовался бы
Добавлено @ 13:58 или
Это сообщение отредактировал(а) nitr - 5.2.2007, 14:01 |
||||||
|
|||||||
| Shaggie |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
nitr, причем здесь =
|
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Shaggie,
ну если верно понял вопрос то вот
|
|||
|
||||
| Nab |
|
||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Ну сейчас вот почти такой вариант и стоит
Я просто немного жестче задал условие. Ну я за nitr'а отвечу Потому что если сделать ссылке на объект просто:
то получим что-то вродк вот такого:
Символ '=' там есть именно когда ссылка приведена к чему либо... Попробуйте...
-------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||||||||||
|
|||||||||||||
| Shaggie |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
Никакого = нету. Что делать? Применять способ Zuzu. Или я что-то неправильно делаю |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
а надо? Идея одна Nab, я тоже ответил тут Добавлено @ 14:24 Shaggie, print ref $obj; измени на print $obj; з.ы.: Shaggie, чуть внимательней... Это сообщение отредактировал(а) nitr - 5.2.2007, 14:25 |
|||
|
||||
| Shaggie |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
||||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Ок, спасибо всем участвовашим, Zuzu, персонально, ткнул носом в доку
Но скорее всего я оставлю свой вариант, считаю его самым универсальным... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| Zuzu |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 3 Всего: 4 |
Nab, можно еще покопаться в коде модуля Data::Dumper - он пишет, что "ссылка приведена". Может там какое-то интересное решение есть. Пишет ведь, к какому пакету приведена ссылка!
Результат:
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
||||
|
|||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Scalar::Util::blessed
|
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Всетаки итог подвести надо...
В Dumper и Scalar::Util реализованы варианты тех методов что и я предлагал, тока еще более извращенно nitr, спасибо напомнил про Scalar::Util. Дело в том что я его усиленно уюзаю, но только одну функцию, а именно weaken для отвязки от зацикливания. Про blessed я читал, когда осваивал этот модуль, просто вылетело из головы... И еще раз спасибо всем, участвовамшим в обсуждении... помогли хоть как-то определиться... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| tishaishii |
|
|||
![]() Создатель ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: 4 Всего: 8 |
Быстрее:
|
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
tishaishii, молодец, реально лучший вариант, получай плюс от меня
Но я вот подумал, что a_sub_not_likely_to_be_here добавляется чтоб его проверить, но ведь начиная с какой то версии Perl, класс UNIVERSAL содержит минимум два метода (can, isa), можно ведь проверять их... Вот что у меня получилось:
Проверил, вроде работает... да, рановато я тему закрыл PS: кстати, tishaishii, вопрос, не могу до конца въехать в этот плюсик что у тебя в коде встречаю... не разъяснишь подробней, плиз... Тока не отсылайте читать документацию, я ее прочел, меня интересует больше обоснованность такого постоянного употребления, большинство кода работает и без него подозреваю... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |