Jus*_*Guy 9 circular-dependency raku
我试图让两个不同的对象相互引用,并在属性上使用类型检查。当我这样做时,我得到Circular module loading detected trying to precompile. 谷歌搜索让我https://docs.raku.org/language/faq#Can_I_have_circular_dependencies_between_modules?其中指出:
请注意,Raku 没有“1 个文件 = 1 个类”的限制,单个编译单元(例如,文件)内的循环依赖可以通过存根实现。因此,另一种可能的解决方案是将类移动到同一个编译单元中。
如果可以避免的话,我宁愿不将两个类都放在同一个单元中。由于没有示例,我不确定如何使用存根来完成此操作。以下是我正在尝试做的一个小例子:
unit class Yak;
use YakStore;
has YakStore $.yak-store is rw;
Run Code Online (Sandbox Code Playgroud)
unit class YakStore;
use Yak;
has Yak $.yak is rw;
Run Code Online (Sandbox Code Playgroud)
use lib '.';
use Test;
use Yak;
use YakStore;
plan 2;
my $yak-store = YakStore.new;
my $yak = Yak.new(:$yak-store);
$yak-store.yak = $yak;
isa-ok $yak-store.yak, Yak;
isa-ok $yak.yak-store, YakStore;
Run Code Online (Sandbox Code Playgroud)
是的,我知道,测试很蹩脚,但我只是想说明问题。谢谢!
处理循环依赖的最好方法是把你的圆变成一个三角形——也就是说,让两个相互依赖的类而不是(至少部分地)依赖于某个第三个角色。
以下是您提供的示例和Shaveable角色(Yaks 应该是Shaveable,对吧?)的情况:
unit role Shaveable;
Run Code Online (Sandbox Code Playgroud)
use YakStore;
use Shaveable;
unit class Yak does Shaveable;
has YakStore $.yak-store is rw;
Run Code Online (Sandbox Code Playgroud)
use Shaveable;
unit class YakStore;
has Shaveable $.yak is rw;
Run Code Online (Sandbox Code Playgroud)
通过这种更改,您示例中的测试现在通过了。