Скажем, у меня есть пакет с именем My::Pkg
, и в этом пакете есть метод класса ->new(...)
для создания новых объектов:
package My::Pkg;
sub new {bless {@_[1..$#_]} => $_[0]}
Есть ли какой-либо вред при определении следующей подпрограммы:
sub My::Pkg {@_ ? My::Pkg::new('My::Pkg', @_) : 'My::Pkg'}
Чтобы кто-то мог написать:
my $obj = My::Pkg one => 1, two => 2;
Вместо:
my $obj = My::Pkg->new(one => 1, two => 2); # which still works, but is longer
Мне нравится краткость метода package-named-constructor-subroutine, но яМне интересно узнать, есть ли какие-либо скрытые ошибки в этой технике, о которых я не задумывался.
Обновление:
Наследование работает правильно, как показано в примере здесь:
{package a; sub new {say "a::new [@_] ", $_[0]->init}}
{package b; our @ISA = 'a'; sub init {"(b::init [@_])"}}
{package a::b; our @ISA = 'b';}
sub a::b {print "absub [@_], "; 'a::b'}
# a::b() called with no args, returns 'a::b', which then becomes 'a::b'->new(...)
a::b->new; # absub [], a::new [a::b] (b::init [a::b])
a::b->new(1, 2, 3); # absub [], a::new [a::b 1 2 3] (b::init [a::b])
# no call to `a::b()` but otherwise the same:
'a::b'->new; # a::new [a::b] (b::init [a::b])
'a::b'->new(1, 2, 3); # a::new [a::b 1 2 3] (b::init [a::b])
new a::b::; # a::new [a::b] (b::init [a::b])
new a::b:: 1, 2, 3; # a::new [a::b 1 2 3] (b::init [a::b])
Интересно, что на данный момент отличается только то, что следующие 2 строки становятся синтаксическими ошибками:
new a::b;
new a::b 1, 2, 3;
Что является синтаксической ошибкой по той же причине some_undefined_sub some_defined_sub;
- одна.
Если определена подпрограмма new
, она анализируется как new( a::b(...) )
, что является нормальным для двух смежных подпрограмм голого слова.
Лично я в порядке, new a::b
становится синтаксической ошибкойоднозначная версия new a::b::
будетВсегда работаю, * * * * * * * * * * * * * * * * * * * * * * * * 1036