【发布时间】:2016-10-18 00:55:49
【问题描述】:
这是 Perl 6 中报告的错误:X::AdHoc instead of X::TypeCheck::Binding with subset parameter,于 2015 年 11 月首次报告。
在使用我的 Perl 6 模块 Chemisty::Elements 时,我遇到了一个我没想到的 Exception 问题。
我定义了一个类型,ZInt,它将数字限制为在周期图上找到的序数(我在这里做了一点伪造)。然后我使用该类型将参数约束到子例程。我希望得到某种X::TypeCheck,但我得到了X::AdHoc:
use v6;
subset ZInt of Cool is export where {
state ( $min, $max ) = <1 120>;
( $_.truncate == $_ and $min <= $_ <= $max )
or warn "Z must be between a positive whole number from $min to $max. Got <$_>."
};
sub foo ( ZInt $Z ) { say $Z }
try {
CATCH {
default { .^name.say }
}
foo( 156 );
}
首先,我收到两次警告,这很奇怪:
Z 必须介于 1 到 120 的正整数之间。得到 。在 zint.p6 第 5 行的块中 Z 必须介于 1 到 120 的正整数之间。得到 。在 zint.p6 第 5 行的块中 X::AdHoc
但是,当我希望人们知道这是一个类型错误时,我得到了 X::AdHoc 类型。
我检查了没有warn 会发生什么并再次得到X::AdHoc:
subset ZInt of Cool is export where {
state ( $min, $max ) = <1 120>;
( $_.truncate == $_ and $min <= $_ <= $max )
};
所以,我想我可以抛出自己的异常:
subset ZInt of Cool is export where {
state ( $min, $max ) = <1 120>;
( $_.truncate == $_ and $min <= $_ <= $max )
or X::TypeCheck.new.throw;
};
但是,我收到警告:
在字符串上下文中使用 Any 类型的未初始化值 如果需要,任何 .^name、.perl、.gist 或 .say 都可以对未定义的内容进行字符串化。
在这一点上,我不知道在抱怨什么。我认为其中一种方法需要我没有提供的东西,但我在文档中看不到任何关于 new 或 throw 参数的信息。
如何在没有警告的情况下获得我想要的类型以及我的自定义文本?
【问题讨论】:
-
我建议在 perl6 用户上也询问它