gpt4 book ai didi

containers - 如何判断某个东西是否是 Perl 6 容器?

转载 作者:行者123 更新时间:2023-12-04 19:34:25 26 4
gpt4 key购买 nike

我没有任何有用的理由知道这一点,但我想知道我是否有一个像 $x 这样的名字。 ,如果那是一个标量变量(可变的东西)或者仅仅是某物的名字(不可变的东西)。我不是要完成任何事情;这是好奇心。

我在玩这样的事情:

my @a  = 'a', ('b', 'c' );
my @b = 'd', 'e', 'f', @a;

my @ab = @a, @b, ( 1, 2 );

for @ab {
put "name: {.^name} VAR: { .VAR.^name }";
when .VAR.can('FETCH') { put "Container: $_" }
when .VAR.can('STORE') { put "Container: $_" }
when Scalar { put "Scalar container: $_" }
when Array { put "Array Container: $_" }
default { put "Object: $_" }
}

我得到:
name: Array VAR: Scalar
Array Container: a b c
name: Array VAR: Scalar
Array Container: d e f a b c
name: List VAR: Scalar
Object: 1 2

我可以看到我可以匹配类型 Array类型匹配,但我想检查一下是否可以 FETCHSTORE将是正确的匹配。

最佳答案

不确定您在这里问的是什么,但是根据您的输入,输出符合预期。

澄清的简化示例:

my (@a, @b, @c);
my @ab = @a, @b, @c;

for @ab {
say "{.^name} contained in a {.VAR.^name}";
}

这将输出
Array contained in a Scalar

三遍,无论 @a的内容如何, @b@c .

请记住,Perl6 中没有隐式扁平化,并且(非本地数组的)数组可变性是通过将其元素放在标量容器中来实现的。

鉴于对您的问题的编辑,也许以下代码将进一步阐明发生了什么:
# make argument raw so binding won't mess with it
sub info($_ is raw) {
dd $_;
put " value type: {.^name}";
put " VAR type: {.VAR.^name}";
put " can fetch: {so .VAR.can('FETCH')}";
put " can store: {so .VAR.can('STORE')}";
}

my \values = 42, my $ = 42, [1, 2], (1, 2);
info $_ for values;

put "\n";

# put values in array, which wraps them in a scalar container
info $_ for [values];

请注意,只有列表和数组可以 STORE (但不是 FETCH ),而标量两者都不能。

这可能是一个惊喜:首先,我们可能期望任何可分配的东西都应该提供 STORE .

查看实现,我们看到带有 sigil @ 的变量和 % , 我们 do call STORE ,但是 not so对于带有 $ 的变量印记。如果我们继续深入兔子洞,我们最终会到达 VM level container specification ,这是如何实现对标量容器的赋值(或调用 Proxy 对象的 STORE 方法)。

关于containers - 如何判断某个东西是否是 Perl 6 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41592104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com