如何设置类的默认参数化?

时间:2019-01-13 19:09:21

标签: perl6

通过^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非参数化版本执行角色{{1}的未参数化版本}。

A

我试图添加一个dd B; # B dd B.^roles; # (), want to see (A[Mu],) 方法,但是只有在类被参数化后才被调用。

非常欢迎提出建议!

1 个答案:

答案 0 :(得分:8)

我得出的结论是,您不能(至少在可预见的将来)。因此,我退了一步,看看我真正想要实现的目标。事实证明,是可能的:

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进行参数化的框架,这是我自己以及最近提出的长期要求。