gpt4 book ai didi

types - 如何为角色组编写模块?

转载 作者:行者123 更新时间:2023-12-03 16:54:52 28 4
gpt4 key购买 nike

角色的一个特性是角色组,它允许您声明多个具有相同名称并接受不同参数的角色,类似于多例程:

role Foo[Int:D] {
method is-int(::?CLASS:_: --> True) { }
method is-str(::?CLASS:_: --> False) { }
}
role Foo[Str:D] {
method is-int(::?CLASS:_: --> False) { }
method is-str(::?CLASS:_: --> True) { }
}

通常,对于一种类型,您有一个模块。问题是你只能有一个 unit模块中的范围声明,因此您不能将其与角色组一起使用。如何为角色组编写模块?

最佳答案

您可以拥有没有 unit 的模块它们中的范围声明并从中导出符号,但是如何导出角色组有点问题。您不能使用 is export为此的特征,因为这将导出错误的类型。当您在声明角色后引用角色时,您指的是角色组,而不是其中的各个角色,而是使用 is export on individual roles 将导出这些单独的角色,而不是角色的组。单个角色的 HOW 与角色组非常不同,并且不会像您通常期望的角色那样表现!

幸运的是,有一种方法可以使用 EXPORT包裹。声明 Foo此包中的角色组将为其命名 EXPORT::DEFAULT::Foo ,你可能不想要,所以你需要在 MY 中声明它单元的范围并在 EXPORT::DEFAULT 中为其声明一个常量反而:

use v6.d;

my role Foo[Int:D] {
method is-int(::?CLASS:_: --> True) { }
method is-str(::?CLASS:_: --> False) { }
}
my role Foo[Str:D] {
method is-int(::?CLASS:_: --> False) { }
method is-str(::?CLASS:_: --> True) { }
}

my package EXPORT::DEFAULT {
constant Foo = ::Foo;
}

现在 Foo可以导入使用OK:
use Foo;

say ::<Foo>:exists; # OUTPUT: True
say try Foo[1].is-int; # OUTPUT: True
say try Foo['ok'].is-str; # OUTPUT: True

注意:您不能使用 ::在常量名称中,因此要在命名空间中导出角色组,您需要将其包装在另一个包中:
my role Foo::Bar[Int:D] { }
my role Foo::Bar[Str:D] { }

my package EXPORT::DEFAULT {
package Foo {
constant Bar = Foo::Bar;
}
}

关于types - 如何为角色组编写模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60878807/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com