我没有任何有用的理由知道这一点,但我想知道我是否有一个名字,如$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方法)的赋值.