什么$(…)
是将值转换为item
.
(标量变量 ( $a
) 中的值也被标记为项目)
say flat (1,2, (3,4) );
# (1 2 3 4)
say flat (1,2, $((3,4)) );
# (1 2 (3 4))
say flat (1,2, item((3,4)) );
# (1 2 (3 4))
基本上它是为了防止值变平。它存在的原因是 Perl 6 不像大多数其他语言那样扁平化列表,有时您需要对扁平化进行更多控制。
以下唯一一种做你想做的事
my \a = $ = 3;
一个bare$
是一个匿名state
变量。
my \a = (state $) = 3;
当您多次运行同一段代码时,问题就会出现。
sub foo ( $init ) {
my \a = $ = $init; # my \a = (state $) = $init;
(^10).map: {
sleep 0.1;
++a
}
}
.say for await (start foo(0)), (start foo(42));
# (43 44 45 46 47 48 49 50 51 52)
# (53 54 55 56 57 58 59 60 61 62)
# If foo(42) beat out foo(0) instead it would result in:
# (1 2 3 4 5 6 7 8 9 10)
# (11 12 13 14 15 16 17 18 19 20)
请注意,变量在调用之间共享。
第一个 Promise 在sleep
调用时停止,然后第二个在第一个运行之前设置状态变量++a
。
如果您改用my $
它,它现在可以正常工作。
sub foo ( $init ) {
my \a = my $ = $init;
(^10).map: {
sleep 0.1;
++a
}
}
.say for await (start foo(0)), (start foo(42));
# (1 2 3 4 5 6 7 8 9 10)
# (43 44 45 46 47 48 49 50 51 52)
问题是无符号的“<em>变量”并不是真正的变量(它们不会变化),它们更类似于词法范围(非)常量。
constant \foo = (1..10).pick; # only pick one value and never change it
say foo;
for ^5 {
my \foo = (1..10).pick; # pick a new one each time through
say foo;
}
基本上,它们的全部意义在于尽可能接近您分配给它的值。(静态单分配)
# these work basically the same
-> \a {…}
-> \a is raw {…}
-> $a is raw {…}
# as do these
my \a = $i;
my \a := $i;
my $a := $i;
请注意,上面我写了以下内容:
my \a = (state $) = 3;
通常在状态变量的声明中,赋值只会在代码第一次运行时发生。Bare $
没有这样的声明,所以我必须通过将声明放在括号中来防止这种行为。
# bare $
for (5 ... 1) {
my \a = $ = $_; # set each time through the loop
say a *= 2; # 15 12 9 6 3
}
# state in parens
for (5 ... 1) {
my \a = (state $) = $_; # set each time through the loop
say a *= 2; # 15 12 9 6 3
}
# normal state declaration
for (5 ... 1) {
my \a = state $ = $_; # set it only on the first time through the loop
say a *= 2; # 15 45 135 405 1215
}