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

如何解决使用 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> 候选者 reports an error。与针对 trait 修饰符的标准多重分派错误相比,当一个人错误地输入一个 trait 名称时,这可以说是一个更好的错误消息。然而,就多重分派而言,它是一个像其他任何一个候选者一样,callsame 将正确地顺从它。

虽然值得要求以一种没有这种副作用的方式完成更好的错误报告,但我能立即想到的唯一解决方案是在 try 周围添加 callsame 并抑制未知特征异常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?