容器 – 如何判断某些东西是否是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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |