Есть ли вред в Perl при создании подпрограммы с тем же именем, что и у пакета?

Допустим, у меня есть пакет под названием 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 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 :: всегда будет работать как tchrist . указано ниже.

10
задан Eric Strom 25 May 2011 в 01:50
поделиться