Forum Webscript.Ru

Программирование => Perl => Тема начата: ctax от 19 Июня 2007, 14:20:34

Название: ref()
Отправлено: ctax от 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;
    }

Заранее большое мерси!
Название: ref()
Отправлено: arto от 19 Июня 2007, 15:59:50
\\&TEST::fun ?
Название: ref()
Отправлено: ctax от 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()}; # работает
но мне кажется это извращение
что думаете? :)
Название: ref()
Отправлено: arto от 19 Июня 2007, 17:14:02
посмотреть в сторону perldoc Alias
Название: ref()
Отправлено: arto от 19 Июня 2007, 17:15:03
но во всяком случае это будет замыкание, вы точно уверены что вам нужны будет все эти проблемы?
Название: ref()
Отправлено: Phoinix от 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\')) {
...
Название: ref()
Отправлено: ctax от 20 Июня 2007, 17:15:55
Спасибо большое