^parameterize
方法允许使用某些给定的信息(例如角色)对类进行参数化。
my role A[::T = Mu] { }
my class B {
method ^parameterize(Mu \base, Mu \type) {
my \what := base.^mixin(A[type]);
what.^set_name(base.^name ~ '[' ~ type.^name ~ ']');
what
}
}
dd B[Int]; # B[Int]
dd B[Int].^roles; # (A[Int],)
但是,我还没有找到一种方法来使
B
的非参数化版本执行A
角色的非参数化版本。dd B; # B
dd B.^roles; # (), want to see (A[Mu],)
我尝试添加
^compose
方法,但是只有在类被参数化后才被调用。建议非常欢迎!
最佳答案
我得出的结论是,您不能(至少在可预见的将来)。因此,我退后了一步,看看我真正想要实现的目标。而的证明是可能的:my role A[::T] {
method foobar() { T }
}
my class B {
method foobar() { Mu }
method ^parameterize(Mu \base, Mu \type) {
my \what := base.^mixin(A[type]);
what.^set_name(base.^name ~ '[' ~ type.^name ~ ']');
what
}
}
dd B.foobar; # Mu
dd B[Int].foobar; # Int
默认情况下,foobar
类提供了B
方法。如果一个参数化了B
类,它将混入另一种版本的foobar
方法(它遮盖了原始方法),该版本将返回参数化给出的类型。
最后,这给了我一个允许对QuantHash
es进行参数化的框架,这是我自己的长期要求,以及最近的其他要求。