在变量中指定 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/
我有一堆 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/