Perl中包名调用方法时双冒号与箭头的差异问询
Time::Piece两种调用方式的差异
针对你给出的这两种strptime调用写法,在Time::Piece的默认场景下没有功能差异,但底层的调用机制存在区别:
- 第一种写法
Time::Piece::strptime("Sun 3rd Nov, 1943", "%A %drd %b, %Y")是直接通过包名+双冒号调用子例程,完全绕开Perl的面向对象方法分发流程,直接定位到Time::Piece包内的strptime子例程执行。 - 第二种写法
Time::Piece->strptime("Sun 3rd Nov, 1943", "%A %drd %b, %Y")是用箭头操作符调用类方法,Perl会触发面向对象的方法解析逻辑:- 先检查
Time::Piece类是否定义了strptime方法 - 由于
Time::Piece没有父类,最终还是会定位到自身的strptime方法 - 执行时会自动将
Time::Piece作为第一个参数传入方法——而strptime作为类方法本来就需要接收类名作为首个参数,所以最终执行效果和直接调用一致
- 先检查
需要注意的是:如果后续strptime被重载,或者类存在继承关系时,两种调用方式可能会产生不同结果,但在Time::Piece的默认实现中,两者的执行结果完全相同。
内容的提问来源于stack exchange,提问作者Mark VY
相关产品推荐
相关产品推荐

