{require`在某些地方不起作用的原因可能是什么?

时间:2019-05-11 10:52:41

标签: require perl6

使用ABC加载模块(require)在发行版的一个模块中工作,而在发行版的另一个模块中失败。 在一个地方用ABC加载require失败是什么原因?

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行:OK *

App::DBBrowser,第690行:您无法创建此类型的实例(子查询)*

App::DBBrowser::CreateTable,第112行:您无法创建这种类型的实例(子查询)*

*版本0.0.1

3 个答案:

答案 0 :(得分:6)

$ 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)

来自documentation

  

require加载compunit并在运行时导入确定的符号。

您正在执行模块的运行时加载,同时还希望该模块的符号在编译时存在。相反,您应该使用间接名称查找(如先前链接的文档页面底部所示):

$ cat XXX.pm6
unit class XXX;

$ cat ZZZ.pm6
module ZZZ {
    require XXX;
    ::("XXX").new;
    say "OK";
}

$ perl6 -I. -e 'use ZZZ;'
OK

答案 1 :(得分:5)

我认为这是因为require是运行时负载,而use是编译时。

通常,除非需要在运行时动态加载模块,否则我通常会使用use

答案 2 :(得分:2)

use在编译时加载和导入模块,而require仅在运行时加载模块。

由于名称空间是在编译时检查的,因此不能像使用use加载和导入的模块那样访问它。

您可以通过符号引用来解决此问题,但也可以将名称空间捕获到变量中。
(假设模块中只有一个名称空间,并且它与用于加载名称空间的名称相同)

Foo.pm6

unit module Foo;

sub fubar () { say 'fubar' }
my \Foo = do require Foo;
Foo::fubar(); # fubar␤

(请注意,变量名不必相同。)