问题描述
这是程序:
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>
候选者 reports an error。与针对 trait 修饰符的标准多重分派错误相比,当一个人错误地输入一个 trait 名称时,这可以说是一个更好的错误消息。然而,就多重分派而言,它是一个像其他任何一个候选者一样,callsame
将正确地顺从它。
虽然值得要求以一种没有这种副作用的方式完成更好的错误报告,但我能立即想到的唯一解决方案是在 try
周围添加 callsame
并抑制未知特征异常。