当前位置: 首页 > 知识库问答 >
问题:

我可以内省一个变量来直接发现它是用什么子集声明的吗?

晋俊贤
2023-03-14

有没有一种方法可以内省一个变量,直接找出它是用什么子集声明的?在这里,我创建了一个子集,但内省指出了它的基本类型:

> subset Prime of Int where .is-prime
(Prime)
> my Prime $x = 23
23
> $x.WHICH
Int|23

我知道它必须将信息存储在某个地方,因为如果我尝试重新分配与子集不匹配的值,它会失败:

> $x = 24
Type check failed in assignment to $x; expected Prime but got Int (24)
in block <unit> at <unknown file> line 1

我试着搜索代码,但我很快就找到了像container这样的文件。c和perl6\U操作。c代码让我眼前一亮。我认为X::TypeCheck::Assignment可能会有所帮助(请参见核心/异常.pm),但我不清楚预期值来自何处。(另请参见此提交)

我觉得我错过了一些显而易见的东西。

我可以检查某些内容是否与子集匹配,但这不能告诉我它是否是用特定子集声明的:

> my Int $y = 43;
43
> $y ~~ Prime;
True

我正在使用Rakudo Star 2017.01

灵感来自Zoffix在最近一篇帖子中使用的子集。

共有1个答案

宰父正真
2023-03-14

您存储在$x中的值是Int。容器(您键入到Prime)可以接受它,因为PrimeInt的子类型。

因此,您感兴趣的不是容器中的值,而是容器的类型。为了获得容器,Perl 6提供了。VAR方法。它有一个<代码>。获取类型的方法:

$ 6 'subset Prime of Int where .is-prime; my Prime $x; dd $x.VAR.of'
Prime

 类似资料:
  • 问题内容: 在Java中,是否可以使用JDK库发现在另一个类中实现的私有类?还是我需要使用asm之类的东西? 问题答案: 就是答案。

  • 下面会对C语言、着色器语言ES GLSL、javascript语言和TypeScript语言声明变量的方式进行简单展示,这样可以更方便不同基础读者类比学习。 C语言 着色器语言ES GLSL和C语言有很多相似之处,如果你有一定的C语言基础,对于学习着色器语言也是有一定的帮助的。 // C语言声明一个整形变量并赋值10 int count = 10; // 改变变量值,重新赋值 count=20;

  • 问题内容: Go代码的这段代码有什么作用? 我相信会返回两件事,第一件事被丢弃,第二件事分配给…接口?我在Github的fswatch中找到了代码。 问题答案: 这个结构将声明一个带有空白标识符名称的变量,其名称由类型文字提供;在这种情况下为接口定义。接下来是初始化程序表达式- 在这种情况下为复合文字的指针。 代码段的总体功能是静态地确保满足所述接口,因为不会以任何方式实现变量,并且只能观察到初始

  • 我在看科特林的文件。在不变性部门,他们的评论如下。我想知道我们为什么要这样做?当我尝试示例代码时,它的作用是相同的。 不变性 首选使用不可变数据而不是可变数据。如果初始化后未修改局部变量和属性,请始终将它们声明为val而不是var。 始终使用不可变集合接口(Collection、List、Set、Map)来声明未变异的集合。使用工厂函数创建集合实例时,始终使用尽可能返回不可变集合类型的函数: 更新

  • 本文向大家介绍什么是JSP声明?我们可以用几种方式编写JSP声明?,包括了什么是JSP声明?我们可以用几种方式编写JSP声明?的使用技巧和注意事项,需要的朋友参考一下 声明声明了一个或多个变量或方法,您可以稍后在JSP文件中的Java代码中使用它们。在JSP文件中使用变量或方法之前,必须先声明该变量或方法。 以下是JSP声明的语法- 您可以编写与上述语法等效的XML,如下所示- 以下是JSP声明的