perl6:传递一个UInt数组失败,而一个Int of Array成功

时间:2017-08-19 17:59:01

标签: arrays perl6

如果我执行以下代码

#!/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中)

1 个答案:

答案 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

这似乎是约束位置的唯一实用方法,因为大多数其他方法都会产生错误。