perl6“ P6opaque,Str”与简单的“ Str”类型

lis*_*tor 8 string perl6 raku p6opaque

我试图从使用常规代码的用户输入中获取列表,但是由于以下错误,有时它会意外失败:

This type cannot unbox to a native integer: P6opaque, Str
Run Code Online (Sandbox Code Playgroud)

代码行是

my @a = prompt("Enter list: ").words || (1,2,3);
Run Code Online (Sandbox Code Playgroud)

仅当我仅输入一个数字时,它才会失败。

什么时候在没有用户意识的情况下将Str转换为“ P6opaque,Str”?我不能使用+ @ a [0]或@a [0] .Int将此“ P6opaque,Str”转换为Int。我在这里想念什么?

非常感谢您的帮助 !!!

赖脯

rai*_*iph 6

TL; DR提到的P6Opaque主要是鲱鱼。一些代码试图将字符串分配给int。您需要Int先将其强制。我知道您已经尝试过了。剩下的就是找出需要做的地方。希望这个答案将指导我们到那里。

您只能将整数分配给整数变量

将字符串分配给Int或的错误int

my Int $a = '1'; # Type check failed ... expected Int but got Str
my int $a = '1'; # This type cannot unbox to a native integer: P6opaque, Str
Run Code Online (Sandbox Code Playgroud)

分配给的错误Int是由高级设备捕获的,它会以高级错误消息作为响应。因为int它是低级别的机器,它响应低级别的消息。我们将在下面仔细研究这种差异,但是就解决您的问题而言,这是一个红色的鲱鱼。

要解决此问题,您需要查找将字符串分配或绑定到具有本机整数类型约束(例如)的变量的位置,int然后在赋值之前使用类似以下内容强制:

my int $a = +'1' # Works
Run Code Online (Sandbox Code Playgroud)

我知道您已经尝试过类似的方法。我不知道为什么它没有用,因为您尚未共享导致问题的代码部分。

发现问题

必须有一些使用原生的整数,要么直接在您的代码(即你明确指定一个本地整数类型,全部小写类型一样的intint32uint等),或在某些代码的代码使用。

因此,请先搜索您的代码。

如果您仍然找不到它,那么请分享足够的代码以使我们可以重现该问题,最好是在阅读了StackOverflow的新近命名/ URL页面“ 如何创建一个最小的,可复制的示例”之后。TIA。

红鲱鱼还是LTA?

“ P6opaque,Str”与简单的“ Str”类型

他们是一样的。P6opaque, Str是对与完全相同类型的引用Str

何时在Str没有用户意识的情况下转换为“ P6opaque,Str”?

不是。

报价is repr和本地表示

P6opaque 是Perl 6中所有对象使用的默认表示形式。

表示是一组规则,用于表示计算机内存中的类型。

与P6对象有关的错误通常由P6语言/编译器的高级“前端”处理。高级错误消息没有提到表示形式,因为大多数普通的P6对象都具有相同的(P6Opaque),即使它们没有表示形式,它们也将不再相关。

但是在这里,我们要处理由MoarVM处理的错误。

如果认为MoarVM的错误消息不相关,则不会提及该消息。例如:

my int64  $a = 2?³
Run Code Online (Sandbox Code Playgroud)

显示MoarVM异常,并显示有关其bigint类型为的类型的错误消息P6bigint

Cannot unbox 64 bit wide bigint into native integer
Run Code Online (Sandbox Code Playgroud)

此错误消息未提及表示形式(P6bigint)。

但是,MoarVM对尝试将非整数以外的任何内容放入本机整数的响应MoarVM异常,它确实提到了表示形式。例如,如果您尝试分配一个,则为Str

This type cannot unbox to a native integer: P6opaque, Str
Run Code Online (Sandbox Code Playgroud)

如果某人不了解表示形式,则此消息有点不透明,也称为LTA。但是,尽管删除表示形式可以消除混乱,但同时也可以删除可能很重要的信息:

This type cannot unbox to a native integer: Str
Run Code Online (Sandbox Code Playgroud)

我不认为这实际上是更好和/或值得的,但是如果您对此有强烈的兴趣,请随时使用LTA标签提交有关MoarVM的错误