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

问题描述 投票:4回答:1

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

> 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.ccontainer.c之类的文件,C代码令我眼前一亮。我以为perl6_ops.c可能会有所帮助(请参阅perl6_ops.c),但我不清楚X::TypeCheck::Assignment值的来源。 (另请参见core/Exception.pm

我觉得我缺少明显的东西。

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

core/Exception.pm

我正在使用Rakudo Star 2017.01


受Zoffix在expected中使用子集的启发。

introspection perl6
1个回答
4
投票

您在this commit中存储的值是> my Int $y = 43; 43 > $y ~~ Prime; True 。容器(您键入a recent post的容器)可接受,因为$xInt的子类型。

所以您感兴趣的不是容器中的值,而是容器的[[type。要获取容器,Perl 6具有Prime方法。并带有一个Prime来获取类型:

Int
© www.soinside.com 2019 - 2024. All rights reserved.