加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中,创建与程序包名称相同的子程序有什么危害吗?

发布时间:2020-12-15 22:01:06 所属栏目:大数据 来源:网络整理
导读:说我有一个名为My :: Pkg的包,该包具有 – new(…)类方法来实例化新对象: package My::Pkg;sub new {bless {@_[1..$#_]} = $_[0]} 定义以下子程序有什么危害吗? sub My::Pkg {@_ ? My::Pkg::new('My::Pkg',@_) : 'My::Pkg'} 所以有人可以写: my $obj = My
说我有一个名为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,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,3;   # a::new [a::b 1 2 3] (b::init [a::b])

有趣的是,到目前为止唯一不同的是,以下2行成为语法错误:

new a::b;
new a::b 1,3;

这是一个语法错误,同样的原因some_undefined_sub some_defined_sub;是一个

如果定义了新的子程序,它将被解析为新的(a :: b(…)),这对于两个相邻的裸字子程序是正常的.

就个人而言,我可以用新的a :: b变成语法错误,明确的版本新的a :: b ::将始终如tchrist一样有效地指出.

解决方法

这就是为什么
$thingie = new Some::Class one => 1,two => 2;

要么

$thingie = new Some::Class::
               one => 1,two => 2,;

存在,所以只是使用它.

但是,是的,我想你会让自己陷入一阵烦恼,因为我是世界上唯一打扰包装的人.我现在没有时间挖掘我的老问题测试代码,但我很确定,如果你走在你所说的道路上,这最终会让你哭泣.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读