Eri*_*rom 10 syntax perl constructor
假设我有一个名为的包My::Pkg,并且该包有一个->new(...)类方法来实例化新对象:
package My::Pkg;
sub new {bless {@_[1..$#_]} => $_[0]}
Run Code Online (Sandbox Code Playgroud)
定义以下子例程有什么危害:
sub My::Pkg {@_ ? My::Pkg::new('My::Pkg', @_) : 'My::Pkg'}
Run Code Online (Sandbox Code Playgroud)
所以有人可以写:
my $obj = My::Pkg one => 1, two => 2;
Run Code Online (Sandbox Code Playgroud)
而不是:
my $obj = My::Pkg->new(one => 1, two => 2); # which still works, but is longer
Run Code Online (Sandbox Code Playgroud)
我喜欢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])
Run Code Online (Sandbox Code Playgroud)
有趣的是,到目前为止唯一不同的是,以下两行成为语法错误:
new a::b;
new a::b 1, 2, 3;
Run Code Online (Sandbox Code Playgroud)
出于同样的原因,这是一个语法错误some_undefined_sub some_defined_sub;.
如果new定义了子例程,则将其解析new( a::b(...) )为两个相邻的裸字子例程的正常情况.
就个人而言,我没有new a::b成为语法错误,明确的版本new a::b::将始终有效,因为tchrist有助于指出如下.
这正是原因所在
$thingie = new Some::Class one => 1, two => 2;
Run Code Online (Sandbox Code Playgroud)
要么
$thingie = new Some::Class::
one => 1,
two => 2,
;
Run Code Online (Sandbox Code Playgroud)
存在,所以只需使用它.
但是,是的,我认为你会陷入一大堆麻烦,因为我是世界上唯一一个无法打包报价的人.我现在没有时间挖掘我的旧问题测试代码,但我很确定如果你走的路上你最终会让你哭泣.
| 归档时间: |
|
| 查看次数: |
220 次 |
| 最近记录: |