【问题标题】:Why isn't the "import" subroutine capitalized in Perl为什么 Perl 中的“导入”子例程不大写
【发布时间】:2011-02-19 16:19:46
【问题描述】:

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

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

为什么 DESTROY 全部大写? Perl on 场合使用纯大写 函数名称作为约定 表示该函数将是 在某些情况下由 Perl 自动调用 方式。其他被称为 隐含包含 BEGIN、END、 AUTOLOAD,加上所有使用的方法 绑定对象,在 perltie 中描述。

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

【问题讨论】:

  • 恐怕没有一致的原因,而且那个import是小写只是因为历史原因,legacy bla bla。

标签: perl naming-conventions implicit


【解决方案1】:

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

完全等价于:

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

【讨论】:

  • 虽然我同意这可能是原因,但我认为从作者和用户的角度来看,这是隐式调用的。
  • 另外,这与tie 调用 TIESCALAR 有何不同?我可以看到 DESTROY 有更多的魔力。
【解决方案2】:

为了稍微扩展 DVK 的答案,在某些情况下,您可能希望明确地调用 import,例如在加载可选模块或自动填充命名空间时:

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

我想不出你会曾经想显式调用 DESTROY、TIESCALAR 等的任何情况。

【讨论】:

  • 我已经明确使用 DESTROY 来破坏循环引用并确保对象被垃圾回收。您通常可以通过使用 weakref 来做到这一点,但并不总是很方便。
【解决方案3】:

这只是设计上的疏忽。改变为时已晚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    相关资源
    最近更新 更多