在变量中指定 Perl 6 class

Specifying a Perl 6 class in a variable

我有一堆 Perl 6 测试,从一些基本测试开始,我将 class 名称放在一个变量中进行测试,并在整个测试过程中使用该变量:

my $package = 'Some::Class';
use-ok $package;

my $class = ::($package);   
can-ok $class, 'new';

我有一段时间没注意这个,但它不再起作用了,因为 classes are lexically loaded now:

No such symbol 'Some::Class'

这不是一个很难解决的问题。在没有 use-ok 和我想要的范围内加载模块 ::($package):

use Some::Class;

...

其他解决方案(打折一个丑陋的 EVAL 也许)有我试图避免的问题。

但是,我不是特别喜欢,因为该名称在文件中出现了两次。我特别喜欢我从 Perl 5 继承下来的以前使用的惯用语。如果我想更改 class 名称,它只在文件中出现一次。我可以很容易地生成样板测试(尽管,修复并没有那么难)。

有什么办法可以让我回到我想要的理想状态? (尽管我认为下一个版本中的词法加载将再次成为障碍)。

总结问题:您想使用符号而不是硬编码来加载模块。 使用常量应该可以为您做到这一点:

constant some-module = 'Some::Module';
use ::(some-module);

您还可以使用 require 在运行时加载模块,这将允许运行时计算值:

my $some-module = 'Some::Module';
require ::($some-module);
::($some-module).foo

在尝试 use-ok 之后这样做是有意义的。

为了加分,您可能会发现本文中的技巧很有用。 http://rakudo.org/2017/03/18/lexical-require-upgrade-info/