`require` 在某些地方不起作用的原因可能是什么?
What could be the reason that `require` doesn't work in some places?
使用 require
加载模块 (ABC
) 在一个发行版的一个模块中有效,而在另一个发行版的模块中失败。
使用 require
加载 ABC
在一个地方失败的原因可能是什么?
require Name::ABC;
my $new = Name::ABC.new(); # dies: You cannot create an instance of this type (ABC)
perl6 -v
This is Rakudo Star version 2019.03.1 built on MoarVM version 2019.03
implementing Perl 6.d.
所需模块:App::DBBrowser::Subqueries
App::DBBrowser::Union,第 80 行:确定 *
App::DBBrowser::Join,第 66 和 191 行:确定 *
App::DBBrowser::Table::Extensions,第 49 行:确定 *
App::DBBrowser,第 690 行:您不能创建此类型的实例(子查询)*
App::DBBrowser::CreateTable,第 112 行:您不能创建此类型的实例(子查询)*
* 版本 0.0.1
我认为这是因为require is a runtime load whereas use是编译时间。
通常我会使用 use
除非我需要在运行时加载动态模块。
$ cat XXX.pm6
unit class XXX;
$ cat ZZZ.pm6
module ZZZ {
require XXX;
XXX.new;
say "OK";
}
$ perl6 -I. -e 'use ZZZ;'
===SORRY!===
You cannot create an instance of this type (XXX)
require loads a compunit and imports definite symbols at runtime.
您正在进行模块的运行时加载,同时还希望该模块的符号在编译时存在。相反,您应该使用间接名称查找(如前面链接的文档页面底部所示):
$ cat XXX.pm6
unit class XXX;
$ cat ZZZ.pm6
module ZZZ {
require XXX;
::("XXX").new;
say "OK";
}
$ perl6 -I. -e 'use ZZZ;'
OK
use
在 compile-time 加载并导入模块,而 require
仅在运行时加载模块。
由于在 compile-time 处检查了名称空间,您不能像使用 use
.
加载和导入的模块那样访问它
您可以通过符号引用来解决这个问题,但您也可以将命名空间捕获到一个变量中。
(假设模块中只有一个命名空间,并且与加载它时使用的名称相同)
Foo.pm6:
unit module Foo;
sub fubar () { say 'fubar' }
my \Foo = do require Foo;
Foo::fubar(); # fubar
(注意变量名不必相同。)
使用 require
加载模块 (ABC
) 在一个发行版的一个模块中有效,而在另一个发行版的模块中失败。
使用 require
加载 ABC
在一个地方失败的原因可能是什么?
require Name::ABC;
my $new = Name::ABC.new(); # dies: You cannot create an instance of this type (ABC)
perl6 -v
This is Rakudo Star version 2019.03.1 built on MoarVM version 2019.03
implementing Perl 6.d.
所需模块:App::DBBrowser::Subqueries
App::DBBrowser::Union,第 80 行:确定 *
App::DBBrowser::Join,第 66 和 191 行:确定 *
App::DBBrowser::Table::Extensions,第 49 行:确定 *
App::DBBrowser,第 690 行:您不能创建此类型的实例(子查询)*
App::DBBrowser::CreateTable,第 112 行:您不能创建此类型的实例(子查询)*
* 版本 0.0.1
我认为这是因为require is a runtime load whereas use是编译时间。
通常我会使用 use
除非我需要在运行时加载动态模块。
$ cat XXX.pm6
unit class XXX;
$ cat ZZZ.pm6
module ZZZ {
require XXX;
XXX.new;
say "OK";
}
$ perl6 -I. -e 'use ZZZ;'
===SORRY!===
You cannot create an instance of this type (XXX)
require loads a compunit and imports definite symbols at runtime.
您正在进行模块的运行时加载,同时还希望该模块的符号在编译时存在。相反,您应该使用间接名称查找(如前面链接的文档页面底部所示):
$ cat XXX.pm6
unit class XXX;
$ cat ZZZ.pm6
module ZZZ {
require XXX;
::("XXX").new;
say "OK";
}
$ perl6 -I. -e 'use ZZZ;'
OK
use
在 compile-time 加载并导入模块,而 require
仅在运行时加载模块。
由于在 compile-time 处检查了名称空间,您不能像使用 use
.
您可以通过符号引用来解决这个问题,但您也可以将命名空间捕获到一个变量中。
(假设模块中只有一个命名空间,并且与加载它时使用的名称相同)
Foo.pm6:
unit module Foo;
sub fubar () { say 'fubar' }
my \Foo = do require Foo;
Foo::fubar(); # fubar
(注意变量名不必相同。)