6

我好奇。大多数 Perl 隐式调用的子例程必须全部大写。TIESCALAR, DESTROY 等。事实上perldoc perltoot

如果构造函数可以有任意名称,那么为什么不使用析构函数呢?因为虽然显式调用了构造函数,但没有显式调用析构函数。销毁通过 Perl 的垃圾收集 (GC) 系统自动发生,这是一个快速但有点懒惰的基于引用的 GC 系统。为了知道调用什么,Perl 坚持将析构函数命名为 DESTROY。Perl 关于调用析构函数的正确时间的概念目前还没有明确定义,这就是为什么你的析构函数不应该依赖于它们何时被调用的原因。

为什么 DESTROY 全部大写?Perl 有时使用纯大写的函数名作为约定,以表明该函数将由 Perl 以某种方式自动调用。其他被隐式调用的方法包括 BEGIN、END、AUTOLOAD,以及绑定对象使用的所有方法,在 perltie 中进行了描述。

那么为什么import子程序要小写呢?有没有人对此有很好的见解?

4

3 回答 3

6

我会说 " import" 没有被隐式调用。这是由实现发出的显式调用use。要引用perldoc 使用

它完全等同于:

BEGIN { require Module; Module->import( LIST ); }

于 2011-02-19T16:44:00.597 回答
3

为了稍微扩展 DVK 的答案,在某些情况下您会合法地想要import显式调用,例如在加载可选模块或自动填充命名空间时:

eval "require $modulename; $modulename->import( LIST ); ";

我想不出任何你想要显式调用 DESTROY、TIESCALAR 等的情况

于 2011-02-19T22:11:07.963 回答
1

这只是设计中的疏忽。改变已经太迟了。

于 2011-02-20T10:17:07.420 回答