我没有任何有用的理由知道这一点,但我想知道我是否有一个名称如$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
类型匹配的类型,但我认为检查某些内容可以FETCH
或STORE
是正确的匹配。
答案 0 :(得分:4)
不确定你在这里问什么,但是根据你的输入,输出是预期的。
澄清的简化示例:
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
),而标量则不能。{/ p>
这可能是一个惊喜:首先,我们可能已经预料到任何可分配的东西应该提供STORE
。
查看实现,我们看到对于带有sigil @
和%
的变量,我们do call STORE
,但not so表示带有$
sigil的变量。如果我们进一步深入兔子洞,我们最终会在VM level container specification结束,这就是对标量容器的赋值(或调用Proxy
对象的STORE
方法)的方法是实现。