这与Perl 6文档仓库中的此问题有关
实际运行BEGIN块
的阶段并不太清楚.文档说"编译时间",但Perl是预编译的,因此实际上可能是预编译时间.事实上,让我们使用这段代码
unit module Beginner;
BEGIN {
say "This is where all started";
}
Run Code Online (Sandbox Code Playgroud)
从这里
require Beginner;
say "Begun";
Run Code Online (Sandbox Code Playgroud)
在一个新目录(rm -rf .precomp运行).它输出:
This is where all started
Begun
Run Code Online (Sandbox Code Playgroud)
到目前为止,
.precomp已经创建了保存缓存的目录.
所以让我们从这里使用它:
use Beginner;
say "Already started";
Run Code Online (Sandbox Code Playgroud)
它显然只是回归Already started.(如果我们运行第一个程序也会发生同样的情况)这可能是一个问题,因为用户可能事先不知道是否可能发生预编译,这反过来意味着它不确定何时发生"编译时间".无论如何,问题是:我们如何正确地制定这个来在文档中解释它?此外,是否应该BEGIN鼓励使用(因为计算的值将存储在预编译缓存中,从而有效地从运行时中消除)或不鼓励?这有什么好的用例吗?
BEGIN 在编译时发生,正如您已正确观察到的,这可能是预编译时间.
我没有看到任何问题,只要你不假设编译发生在脚本启动时.就像在编译时评估C++模板一样,这通常与执行时间非常不同.
此外,是否应该鼓励使用BEGIN(因为计算的值将存储在预编译缓存中,从而有效地从运行时中消除)或不鼓励
应该鼓励一切适当的用例,并且对其他一切都不鼓励.
如果你想在程序启动时运行一些东西,请使用INIT,而不是BEGIN.
这有什么好的用例吗?
许多元编程可以(并且应该)在编译时完成,例如基于固定的名称列表创建方法和属性的列表.在每个程序启动时执行此操作将是一种浪费,并且程序的其他部分可能在编译时需要完整类型.
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |