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

在Perl中new Some :: Class和Some :: Class-> new()之间有什

发布时间:2020-12-15 21:24:26 所属栏目:大数据 来源:网络整理
导读:很多年前,我记得一个程序员辅导这个: new Some::Class; # bad! (but why?)Some::Class-new(); # good! 可悲的是,现在我不记得/他的原因。 :(即使构造函数实际上不存在于Some :: Class模块中,而是继承自某处的父类,两个表单都将正常工作。 这两种形式都
很多年前,我记得一个程序员辅导这个:
new Some::Class;    # bad! (but why?)

Some::Class->new(); # good!

可悲的是,现在我不记得/他的原因。 :(即使构造函数实际上不存在于Some :: Class模块中,而是继承自某处的父类,两个表单都将正常工作。

这两种形式都不像Some :: Class :: new(),它不会将类的名称作为构造函数的第一个参数 – 所以这种形式总是不正确。

即使两个形式是等效的,我发现Some :: Class-> new()更清楚,因为它遵循在模块上调用方法的标准约定,在perl中,’new’方法是不是特殊的 – 一个构造函数可以被称为任何东西,new()可以做任何事情(虽然当然我们通常期望它是一个构造函数)。

解决方法

使用new Some :: Class被称为“间接”方法调用,它是坏的,因为它在语法中引入了一些歧义。

它可能失败的一个原因是如果你有一个数组或哈希对象。你可能会期望

dosomethingwith $hashref->{obj}

等于

$hashref->{obj}->dosomethingwith();

但它实际上解析为:

$hashref->dosomethingwith->{obj}

这可能不是你想要的。

另一个问题是,如果你的包中有一个函数与你试图调用的方法同名。例如,如果你使用的某个模块导出一个称为dosomethingwith的函数怎么办?在这种情况下,dosomethingwith $ object是不明确的,并且可能导致困惑的bug。

使用 – >语法排除了这些问题,因为方法和你想要的操作方法对编译器总是很清楚。

(编辑:李大同)

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

    推荐文章
      热点阅读