這在Perl 6的一個報告的bug:X::AdHoc instead of X::TypeCheck::Binding with subset parameter,首先是在2015年十一月爲什麼Perl 6爲我的子集類型拋出X :: AdHoc異常?
報道雖然與我的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.得到< 156>。在zint.p6第5行第5行 Z必須介於從1到120的正整數之間。得到< 156>。在zint.p6線5 X ::即席
但是,塊我得到的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;
};
但是,我得到一個警告:
在字符串上下文中使用任何類型的未初始化值 如果需要,。^ name,.perl,.gist或.say中的任何一個都可以將未定義的事物串聯起來。
在這一點上,我不知道什麼是抱怨。我認爲其中一種方法需要我沒有提供的東西,但是我沒有在文檔中看到有關new
或throw
的任何參數。
我該如何獲得我想要的類型而沒有警告,還有我的自定義文本?
我建議,要求它perl6用戶也 – teodozjan
這是一個開放的bug:https://rt.perl.org/Public/Bug/Display.html?id=126763 –