加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

容器 – 如何判断某些东西是否是Perl 6容器?

发布时间:2020-12-16 06:24:30 所属栏目:大数据 来源:网络整理
导读:我没有任何有用的理由知道这一点,但我想知道我是否有一个名字,如$x,如果这是一个标量变量(可变的东西)或仅仅是某个东西的名称(不可变的东西).我不想做任何事;这是好奇心. 我正在玩这样的事情: my @a = 'a',('b','c' );my @b = 'd','e','f',@a;my @ab = @a,@
我没有任何有用的理由知道这一点,但我想知道我是否有一个名字,如$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

我可以看到我可以匹配数组类型匹配的类型,但我认为检查某些东西可以FETCH或STORE是正确的匹配.

解决方法

不确定你在这里问什么,但是根据你的输入,输出是预期的.

澄清的简化示例:

my (@a,@c);
my @ab = @a,@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];

请注意,只有列表和数组可以存储(但不能存储FETCH),而标量和数组都不能存储.

这可能是一个惊喜:一方面,我们可能已经预料到任何可分配的应该提供一个商店.

看一下实现,我们看到对于带有sigil @和%的变量,我们do call STORE,但是not so用于带有$sigil的变量.如果我们进一步深入兔子洞,我们最终会在VM level container specification结束,这就是如何实现对标量容器(或调用Proxy对象的STORE方法)的赋值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读