假设我有一个名为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])
有趣的是,到目前为止唯一不同的是以下两行成为语法错误:
new a::b;
new a::b 1, 2, 3;
出于
some_undefined_sub some_defined_sub;
为1的相同原因,这是语法错误。如果定义了
new
子例程,则将其解析为new( a::b(...) )
,这对于两个相邻的裸字子例程是正常的。就我个人而言,
new a::b
成为语法错误是可以的,明确的new a::b::
版本将始终可以正常工作,因为下面的tchrist会有所帮助。 最佳答案
那就是正是为什么
$thingie = new Some::Class one => 1, two => 2;
或者
$thingie = new Some::Class::
one => 1,
two => 2,
;
存在,所以使用它。
但是,是的,我想您会遇到很多麻烦,因为我是世界上唯一一个愿意打包报价的人。我现在没有时间深入研究旧的问题测试代码,但是我敢肯定,如果您按照自己的意愿去做,这最终会使您哭泣。
关于perl - 在Perl中,创建与程序包同名的子例程是否有害?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6116324/