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

时间:2017-04-05 12:51:35

标签: introspection perl6

有没有办法内省变量来直接找出它声明的子集?在这里,我创建了一个子集,但内省指向我的基本类型:

> 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.cperl6_ops.c等文件,其中C代码使我的眼睛茫然。我认为X::TypeCheck::Assignment可能有所帮助(请参阅core/Exception.pm),但我不清楚expected值的来源。 (另见this commit

我觉得我错过了一些明显的东西。

我可以检查某些内容是否与某个子集相匹配,但这并不能告诉我它是否与某个子集一起声明:

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

我使用Rakudo Star 2017.01

受Zoffix在a recent post中使用子集的启发。

1 个答案:

答案 0 :(得分:4)

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

所以你感兴趣的不是容器中的值,而是容器的类型。为了获得容器,Perl 6具有.VAR方法。并且有一个.of method来获取类型:

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