Автор Тема: ref()  (Прочитано 4625 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ctax

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 22
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
ref()
« : 19 Июня 2007, 14:20:34 »
Здравствуйте господа.
У меня есть маленький вопрос:
есть функция вида $ref->fun(),
как мне получить ссылку на нее и
тип ссылки должен быть CODE.

В таком виде получаю SCALAR :(((
#!/usr/bin/perl
use strict;
my $ref=[];
bless $ref,\'TEST\';

print ref(\\$ref->fun());

package TEST;

sub fun
    {
        return 1;
    }

Заранее большое мерси!

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
ref()
« Ответ #1 : 19 Июня 2007, 15:59:50 »
\\&TEST::fun ?

Оффлайн ctax

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 22
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
ref()
« Ответ #2 : 19 Июня 2007, 16:53:59 »
Так конечно да, но в случае, когда имя класса не известно, например в  функции, которая должна возвратить CODE - ссылку на функцию begin()  любого модуля.

sub get_code_ref
{
my $blessed_ref = shift;
return \\$blessed_ref->begin(); # все так же возвращает SCALAR...
}

Надеюсь не запутал.

И еще мысль по-ходу, мне кажется можно сделать так
my $code_ref = sub{$ref->begin()}; # работает
но мне кажется это извращение
что думаете? :)

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
ref()
« Ответ #3 : 19 Июня 2007, 17:14:02 »
посмотреть в сторону perldoc Alias

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
ref()
« Ответ #4 : 19 Июня 2007, 17:15:03 »
но во всяком случае это будет замыкание, вы точно уверены что вам нужны будет все эти проблемы?

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
ref()
« Ответ #5 : 20 Июня 2007, 12:43:25 »
ctax

Вариант 1:

my $obj = new Some::Module;
my $module_name = ref $obj;
my $sub_name = $module_name.\'::fun\';
my $sub_module = \\&$sub_name;

Вариант 2:

my $obj = new Some::Module;
my $sub_module = $obj->can(\'fun\');


P.S. Естественно не забыть сделать проверку на существование метода в объекте, тем же can:

if ($obj->can(\'fun\')) {
...

Оффлайн ctax

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 22
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
ref()
« Ответ #6 : 20 Июня 2007, 17:15:55 »
Спасибо большое

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28