如果我执行以下代码
#!/usr/bin/perl6
use v6.c;
use fatal;
sub foo(Int:D @nums) {
say @nums.join(" ");
}
sub bar(UInt:D @nums) {
say @nums.join(" ");
}
my UInt:D @nums = (1, 2);
say "foo: ";
foo(@nums);
say "bar: ";
bar(@nums);
我得到以下输出:
foo:
1 2
bar:
Constraint type check failed for parameter '@nums'
in sub bar at ./test.p6 line 9
in block <unit> at ./test.p6 line 17
但我不明白,如果我使用UInt-或Int-Arrays,为什么会有所不同。这可能是个错误吗?
我正在使用基于MoarVM版本2016.12构建的Rakudo版本2016.12(包含在Debian中)
答案 0 :(得分:1)
问题似乎出现在错误消息中。如果你使用像2018.03这样的新版本,那就说
Constraint type check failed in binding to parameter '@nums'; expected UInt but got Array[UInt] (Array[UInt].new(1, 2))
也就是说,您可以将代码更改为:
use v6;
use fatal;
sub foo( @nums where { @nums ~~ Array[Int] } ) {
say @nums.join(" ");
}
sub bar( @nums where { @nums ~~ Array[UInt] } ) {
say @nums.join(" ");
}
my UInt @nums = (1, 2);
say "foo: ";
foo(@nums);
say "bar: ";
bar(@nums);
我猜,这将表现如预期:
Constraint type check failed in binding to parameter '@nums'; expected anonymous constraint to be met but got Array[UInt] (Array[UInt].new(1, 2))
in sub foo at uint.p6 line 6
in block <unit> at uint.p6 line 16
这似乎是约束位置的唯一实用方法,因为大多数其他方法都会产生错误。