Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > возврат значения


Автор: gcc 13.5.2009, 00:56
есть модуль не маленький
желательно нужно сделать такие дейтсвия, сразу два метода обработать:

Код

$f->exist->cut_xss('keys' => 'keys');


если я правильно понял, то exist возвращает объект

можно ли узнать что возвращать просто значеие или что нужно возвратить объект?

Код

    return $self->{value} if (defined wantarray);
   return $self;


у меня exist передает данные в SQL::Abstract или другой метод выводит массив с ошибками если какие-то данные не правильные....

как инициализировать 2 метода если один может возвратить не объект а значение...?

Код

sub exist {
 my $self = shift;

  $self->{key} = shift; 
  # $self->{value} = shift;

    $self->_del_blanks_end_began();
    
        $self->_add_all_fields();
        
        print $self->{value};

    if (! $self->{value}) {
        $self->_add_bad_fields();        
     $self->{value} = undef;
    }

   #return $self->{value} if (defined wantarray);
   return $self;
 
}

sub cut_xss {

 my $self = shift;

  $self->{key} = shift; 
  $self->{value} = shift; 
    
    $self->_del_blanks_end_began;
    $self->_clean_html;
    
    print $self->{value};
    # $self->_add_all_fields();
   
    return $self->{value} if (defined wantarray);
    # return $self;
}

Автор: DaemonSuw 13.5.2009, 08:11
Проверять возвращаемое значение можно с помощью UNIVERSAL::isa( VAL, TYPE )...

Код

require UNIVERSAL ;
my $a = $f->exist;
if  (UNIVERSAL::isa ($a, 'ARRAY')) { print 'return ARRAY'}
elsif (UNIVERSAL::isa ($a, 'SQL::Abstract')) { print 'return SQL::Abstract'}
else {print 'xz'};

Автор: KSURi 13.5.2009, 12:59
Для проверки класса объекта использовать процедурный вариант не рекомендуется. Используйте вызов метода:
Код

$a->isa('SQL::Abstract') && print 'return SQL::Abstract'

а еще лучше так:
Код

use Scalar::Util qw(blessed);
blessed($a) && $a->isa('SQL::Abstract') && print ...
.

ЗЫ: я не уверен, что понял вопрос

Автор: gcc 13.5.2009, 13:59
Цитата(KSURi @ 13.5.2009,  12:59)
а еще лучше так:
Код

use Scalar::Util qw(blessed);
blessed($a) && $a->isa('SQL::Abstract') && print ...
.

ЗЫ: я не уверен, что понял вопрос

скорее всего так

Код

sub exist {
 my $self = shift;
  $self->{key} = @_[1]     if ( !blessed(@_[1]) ); 
  $self->{value} = @_[2]  if ( !blessed(@_[2]) ); 

.........................................


Код

$f->exist->cut_xss('keys', 'keys');

Автор: gcc 13.5.2009, 14:47
а как тут опрделеить что возвращать объект или значение?

cut_xss ждет что exist должно возвратить объект, правильно?
если мне надо иногда возвратить значение, но не объект...

как тут сделать? или никак?

Автор: gcc 13.5.2009, 21:57
Цитата(KSURi @ 13.5.2009,  12:59)
ЗЫ: я не уверен, что понял вопрос

например, есть методы:
Код

$f->exist(keys' => 'keys')
$f->cut_xss('keys' => 'keys');
$f->exist(keys' => 'keys')
$f->cut_xss('keys' => 'keys');
$f->exist(keys' => 'keys')
$f->cut_xss('keys' => 'keys');
$f->exist(keys' => 'keys')
$f->cut_xss('keys' => 'keys');


можно тут сразу два инициализировать?

Код

$f->exist->cut_xss('keys' => 'keys');


ошибка! мне говрит что метод cut_xss отсутсвует, потому что объекта нету, он ушел в exist

если написать return $self то работает, но объект не всегда нужен!

как тут сделать?

Автор: KSURi 14.5.2009, 11:12
Теперь понятно) Возможно, правильнее будет сделать редизайн методов, чем заморачиваться с конструкциями языка.
Если вы все-таки уверены, то что должен возвращать метод exist, когда не нужен объект?

Автор: gcc 15.5.2009, 02:47
Код

 my $self = shift;
 
   $self->{key} = shift if @_; 
   $self->{value} = shift if @_;

.........................

    return $self->{value} if (wantarray);     
     return $self;


сделал так, вроде бы работает 
там не надо было defined ставить перед wantarray

Код

$f->cut_xss('text',  $c->request->params->{text})->exist;



Автор: gcc 24.7.2009, 02:46
есть запись, например:
Код

$f->cut_xss('text',  $c->request->params->{text})->exist;


1) как мне узнать в методе cut_xss() что поле него будет вызывается еще один метод?

2) или  как мне узнать в методе cut_xss() что поле него будет вызывается метод exist()?

Добавлено через 2 минуты и 37 секунд
Цитата(KSURi @ 14.5.2009,  11:12)
Теперь понятно) Возможно, правильнее будет сделать редизайн методов, чем заморачиваться с конструкциями языка.

вот только как его сделвть?
вот тут такой же пример http://forum.vingrad.ru/forum/topic-258166.html если знаете, то покажите пример пожалуйста с редизайном... (если там будет лучше)

Добавлено через 9 минут и 46 секунд
Цитата(DaemonSuw @ 13.5.2009,  08:11)
Проверять возвращаемое значение можно с помощью UNIVERSAL::isa( VAL, TYPE )...

Код

require UNIVERSAL ;
my $a = $f->exist;
if  (UNIVERSAL::isa ($a, 'ARRAY')) { print 'return ARRAY'}
elsif (UNIVERSAL::isa ($a, 'SQL::Abstract')) { print 'return SQL::Abstract'}
else {print 'xz'};

интересно, но вот толкьо мне нужно проверить в самом методе exist...

UNIVERSAL

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)