使用nextsame或callame时出现奇怪的“无法使用未知特征”

这是程序:

my %SUB-COUNTS;

say "Start";

multi sub trait_mod:<is>(Sub $s where .name().contains("-logged"), :$AOP) {
    $s.wrap({
        say "Entering { $s.name }";
        callsame;
    });
}

multi sub trait_mod:<is>(Sub $s where .name().contains("-counted"), :$AOP) {
    $s.wrap({
        say "Counting { $s.name }";
        %SUB-COUNTS{$s.name}++;
    });
}

sub water-logged() is AOP {
    return "Water";
}

sub out-logged() is AOP {
    return "Out";
}

sub we're-counted() is AOP {
    state $count = 0;
    return $count++;
}

sub we're-counted-and-logged() is AOP {
    state $alpha = 'a';
    return $alpha++;
}

say water-logged(), " ", out-logged(), " ", water-logged();

say we're-counted() for ^20;

say we're-counted-and-logged() for ^20;

say %SUB-COUNTS;

这是有效的,但只有 1 个特征可以应用于每个例程,所以我考虑使用 redispatch 以便可以计算和记录例程。但是,这样做:

multi sub trait_mod:<is>(Sub $s where .name().contains("-logged"), :$AOP) {
    $s.wrap({
        say "Entering { $s.name }";
        callsame;
    });
    callsame;
}

导致一个奇怪的编译错误:

Can't use unknown trait 'is' -> 'AOP' in a sub declaration.
at /home/jmerelo/txt/docencia/presentaciones/aop-raku/code/point-cut.raku:23
    expecting any of:
        rw raw hidden-from-backtrace hidden-from-USAGE pure default
        implementation-detail DEPRECATED inlinable nodal prec equiv
        tighter looser assoc leading_docs trailing_docs

第 23 行是第一个使用AOP. 所以我有点迷失在这里。为什么添加单个语句会以这种方式改变语法?

回答

不幸的是,如果没有找到匹配的特征,有一个multi候选者trait_mod:<is>会报告错误。与针对 trait 修饰符的标准多重分派错误相比,当一个人错误地输入一个 trait 名称时,这可以说是一个更好的错误消息。然而,就多重分派而言,它是一个像任何其他人一样的候选人,并且callsame会正确地服从它。

虽然值得要求以一种没有这种副作用的方式进行更好的错误报告,但我能立即想到的唯一解决方案是try绕过callsame和抑制未知特征异常。

  • 它转到下一个适用的候选人;`counted` 只适用于你有一个名字包含 `logged` 和 `counted` 的 `sub`。您示例中的第一个“sub”是“sub water-logged() is AOP {”,因此“counted”不适用,因此下一个最适用的候选者是错误报告者。

以上是使用nextsame或callame时出现奇怪的“无法使用未知特征”的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>