我怀疑这可能是Rakudo的一个错误,但我今天刚刚开始玩Perl 6,所以我很有可能犯了一个错误.在这个简单的程序中,在sub中声明一个类型化数组似乎会使Perl 6编译器生气.删除数组上的类型注释可以消除编译器错误.
这是一个简单的素数查找程序:
#!/usr/bin/env perl6
use v6;
sub primes(int $max) {
my int @vals = ^$max; # forcing a type on vals causes compiler error (bug?)
for 2..floor(sqrt($max)) -> $i {
next if not @vals[$i];
@vals[2*$i, 3*$i ... $max-1] = 0;
}
return ($_ if .Bool for @vals)[1..*];
}
say primes(1000);
Run Code Online (Sandbox Code Playgroud)
在Rakudo Star 2016.07.1(来自Fedora 24 repos),该程序给出以下错误:
[sultan@localhost p6test]$ perl6 primes.p6
Cannot unbox a type object
in sub primes at primes.p6 line 8
in block <unit> at primes.p6 line 13
Run Code Online (Sandbox Code Playgroud)
如果我删除vals数组上的类型注释,程序可以正常工作:
...
my @vals = ^$max; # I removed the int type
...
Run Code Online (Sandbox Code Playgroud)
我在使用Perl 6时犯了一个错误,或者这是Rakudo中的一个错误?
rai*_*iph 13
您收到的错误消息引起了对第8行的注意:
@vals[2*$i, 3*$i ... $max-1] = 0;
Run Code Online (Sandbox Code Playgroud)
该行将右侧的值列表分配给=左侧的元素列表.
左侧列表中的第一个元素@vals[2*$i]为零.
您没有在右侧定义任何更多值,因此左侧的其余元素被分配了一个Mu.Mus作为没有特定类型且没有特定值的元素的占位符很好地工作.Mu除了它的类型安全之外,还可以将其视为Null.
这个高尔夫版本可以获得相同的场景:
my @vals;
@vals[0,1] = 0; # assigns 0 to @vals[0], Mu to @vals[1]
Run Code Online (Sandbox Code Playgroud)
如您所见,当您没有为@vals数组元素指定显式类型约束时,一切正常.
这是因为数组元素的默认类型约束是Mu.因此Mu,为元素分配是很好的.
如果您觉得它收紧了代码,您可以明确指定零:
@vals[2*$i, 3*$i ... $max-1] = 0 xx Inf;
Run Code Online (Sandbox Code Playgroud)
这会在RHS上生成(惰性)无限的零列表,以便将零分配给LHS上的每个元素列表.
只需进行此更改,即使您为其指定了类型约束,您的代码也会正常工作@vals.
如果你不介绍xx Inf,但做指定元素类型约束的@vals,是不是Mu,那么如果你尝试给一个你的代码将失败类型检查Mu到的元素@vals.
类型检查失败将以两种风格之一出现,具体取决于您使用的是对象类型还是本机类型.
如果指定对象类型约束(例如Int):
my Int @vals;
@vals[0,1] = 0;
Run Code Online (Sandbox Code Playgroud)
那么你得到一个像这样的错误:
Type check failed in assignment to @vals; expected Int but got Mu (Mu)
Run Code Online (Sandbox Code Playgroud)
如果指定本机类型约束(例如,int而不是Int):
my int @vals;
@vals[0,1] = 0;
Run Code Online (Sandbox Code Playgroud)
然后编译器首先尝试在尝试进行类型检查之前从对象值(这称为"拆箱")生成合适的本机值.但是没有与对象值(Mu)对应的合适的原生值.所以编译器抱怨它甚至无法取消装箱值.最后,正如一开始所暗示的那样,虽然Mu作为一种类型安全的Null非常有效,但这只是其中的一个方面Mu.另一个是它是一个"类型对象".所以错误信息是Cannot unbox a type object.
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |