首页 > 解决方案 > perl6 "P6opaque, Str" 与简单的 "Str" 类型

问题描述

我试图从用户输入中获取一个列表,使用我通常的代码,但有时它会因为这个错误而无法预料地失败:

This type cannot unbox to a native integer: P6opaque, Str

代码行是

my @a = prompt("Enter list: ").words || (1,2,3);

只有当我只输入一个数字时它才会失败。

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

标签: stringraku

解决方案


TL; DR提到的P6Opaque主要是红鲱鱼。一些代码试图将字符串分配给int. 您需要将其强制为Int第一个。我知道你已经尝试过了。剩下的就是找出需要在哪里完成。希望这个答案能指导我们。

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

将字符串分配给 anInt或 an是错误的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

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

要解决此问题,您需要找到字符串被分配或绑定到具有原生整数类型约束的变量的位置int,然后在分配之前使用如下内容强制:

my int $a = +'1' # Works

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

发现问题

必须在您的代码中直接使用本机整数(即您明确指定本机整数类型,全小写类型,如,int等)或在您的代码使用的某些代码中。int32uint

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

如果您仍然没有找到它,那么请分享您的代码,以便我们可以重现问题,最好是在阅读 StackOverflow 的新命名/URL 页面How to create a Minimal, Reproducible Example 之后。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⁶³

显示MoarVM 异常,并显示有关其表示形式的类型的错误消息bigintP6bigint

Cannot unbox 64 bit wide bigint into native integer

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

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

This type cannot unbox to a native integer: P6opaque, Str

如果有人不了解表示,则此消息有点不透明,即LTA。但是,在删除表示消除了混淆的同时,它也删除了可能很重要的信息:

This type cannot unbox to a native integer: Str

我不相信这实际上更好和/或值得,但是如果您对此有强烈的感觉,请随时使用 LTA tag 提交有关此问题的 MoarVM 错误


推荐阅读