[Moscow.pm] дефолтные методы объекта и AUTOLOAD

Dmitry Karpich meettya на gmail.com
Ср Мар 28 05:23:44 PDT 2012


On Mar 28, 2012, at 2:08 PM, Nick Knutov wrote:

> И Class::Accessor не надо.
> А вот в отквотированном ниже коде я минусов не вижу.
> 
наследование. Оно не работает.

Я как-то давненько писал что-то подобное
http://search.cpan.org/perldoc?Object::Botox
Но не стоит этим пользоваться.
Медленно.

Возьмите Moose или *Acc-что-то там.

Митяй.

> btw, мне совершенно не нужен контроль ro/rw и у меня нет сеттеров.
> 
> 28.03.2012 16:03, Ilya Chesnokov написал:
>> Ага, только он в ~6 раз быстрее Class::Accessor - а так не надо, конечно ;)
>> 
>> 28 марта 2012 г. 13:54 пользователь Nick Knutov<mail на knutov.com>  написал:
>>> Вещи, имеющие синтаксис вида
>>> 
>>> has 'x' =>  (is =>  'rw', isa =>  'Int');
>>> has 'y' =>  (is =>  'rw', isa =>  'Int');
>>> 
>>> не вариант вообще. Это плохо, это многобукв, так писать не надо.
>>> 
>>> 
>>> 28.03.2012 15:52, Alexandr Alexeev написал:
>>>> 
>>>> https://metacpan.org/module/Mouse умеет это и кое-что другое. Работает
>>>> быстро, так что не путать с Moose.
>>>> 
>>>> 28 марта 2012 г. 13:43 пользователь Гнатына Александр<gnatyna на ya.ru
>>>> <mailto:gnatyna на ya.ru>>  написал:
>>>> 
>>>> 
>>>> 
>>>>    package My::Base;
>>>>    sub _prop_simple_call{
>>>>        my $self  = shift;
>>>>        my $name = shift;
>>>>        if(@_){
>>>>            $self->{$name} = $_[0];
>>>>        }
>>>>        return $self->{$name};
>>>>    }
>>>>    sub _make_simple_props{
>>>>        my $class = shift;
>>>>        my @names = @{shift||[]};
>>>>        for my $name(@names){
>>>>            no strict "refs";
>>>>            my $func = $class.'::'.$name;
>>>>            *$func  = sub {
>>>>                my $self = shift;
>>>>                return $self->_prop_simple_call($name, @_);
>>>>            }
>>>>        }
>>>>    }
>>>> 
>>>>    package My::Some;
>>>>    use base My::Base;
>>>> 
>>>>    __PACAKGE__->_make_simple_props([qw(id name title)]);
>>>> 
>>>>    В Срд, 28/03/2012 в 15:21 +0600, Nick Knutov пишет:
>>>>     >  Есть ряд объектов, у которых есть заранее известный, но иногда
>>>>     >  меняющийся [в процессе разработки] список полей, для которых надо
>>>>    писать
>>>>     >  геттеры вида
>>>>     >
>>>>     >  sub id { my $self = shift; return $self->{id}; }
>>>>     >
>>>>     >  Или с логикой чуть посложнее, но это еще один список полей и
>>>>    полностью
>>>>     >  одинаковый код, кроме имени поля.
>>>>     >
>>>>     >  Возникла мысль генерить эти методы из заранее определенного списка
>>>> на
>>>>     >  этапе, например, загрузки модуля или компиляции кода. perldoc что?
>>>>     >
>>>>     >  Альтернативный вариант - сделать то же самое через AUTOLOAD, вот
>>>>    только
>>>>     >  в гугле находятся несколько очень разных примеров, как это
>>>>    делается, и в
>>>>     >  каждом говорится, что примеров есть разные, но вот именно этот
>>>> способ
>>>>     >  лучше и избавит от разных проблем и багов. So, как все же это
>>>>    надо делать?
>>>>     >
>>>>     >  --
>>>>     >  Best Regards,
>>>>     >  Nick Knutov
>>>>     >  http://knutov.com
>>>>     >  ICQ: 272873706
>>>>     >  Voice: +7-904-84-23-130
>>>> 
>>>> 
>>>>    --
>>>>    Moscow.pm mailing list
>>>>    moscow-pm на pm.org<mailto:moscow-pm на pm.org>  | http://moscow.pm.org
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> --
>>>> С уважением, Александр
>>>> Личный блог: http://eax.me/
>>>> Мой форум: http://it-talk.org/
>>>> Мой Twitter: http://twitter.com/afiskon
>>>> 
>>>> 
>>>> 
>>> 
>>> --
>>> Best Regards,
>>> Nick Knutov
>>> http://knutov.com
>>> ICQ: 272873706
>>> Voice: +7-904-84-23-130
>>> --
>>> Moscow.pm mailing list
>>> moscow-pm на pm.org | http://moscow.pm.org
>> 
>> 
>> 
> 
> -- 
> Best Regards,
> Nick Knutov
> http://knutov.com
> ICQ: 272873706
> Voice: +7-904-84-23-130
> -- 
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org



Подробная информация о списке рассылки Moscow-pm