types - 如何为角色组编写模块?
问题描述
角色的一个特性是角色组,它允许您声明多个具有相同名称并接受不同参数的角色,类似于多例程:
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
在单个角色上使用将导出这些单个角色,而不是角色组。单个角色的 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;
}
}
推荐阅读
- python - 如何使用python将多个数据框中存在的一个特定列写入列表?
- python - 在数据框行的文本标签上创建成对相似度矩阵
- php - 为了保留彩色输出,我必须将 lynis 导出为什么格式?
- unity3d - MRTK“控制台”在构建时出现在一只眼睛中
- javascript - 如何用逗号而不是点对价格进行四舍五入?
- django - Django 保持签名两周或直到浏览器关闭
- reactjs - 如何在 React JS 中更改错误警报的位置
- here-api - 为什么使用公共交通的 HERE Routing API 中的参数 TransitRadius 不会更改响应
- python - 在models.py中添加外键时遇到错误
- python - 我怎样才能为每个组合总结一个熊猫数据框?