解决圆形模块加载的最佳方法

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)

YakStore.rakumod

unit class YakStore;

use Yak;

has Yak $.yak is rw;
Run Code Online (Sandbox Code Playgroud)

yak.rakutest

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)

是的,我知道,测试很蹩脚,但我只是想说明问题。谢谢!

cod*_*ons 9

处理循环依赖的最好方法是把你的圆变成一个三角形——也就是说,让两个相互依赖的类而不是(至少部分地)依赖于某个第三个角色。

以下是您提供的示例和Shaveable角色(Yaks 应该是Shaveable,对吧?)的情况:

Shaveable.rakumod

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)

YakStore.rakumod

use Shaveable;
unit class YakStore;

has Shaveable $.yak is rw;
Run Code Online (Sandbox Code Playgroud)

通过这种更改,您示例中的测试现在通过了。