该will相位特性的例子表明这样的代码:
our $h will enter { .rememberit() } will undo { .forgetit() };
Run Code Online (Sandbox Code Playgroud)
这要么被误解,要么根本不是真正的用例。如果它被误解了,我会说它enter是分配了一个变量的块。如果它不是一个真正的用例,它会调用一个未定义变量的方法。这是似乎发生的事情:
our &doing-good will enter {
say( "running" );
if Backtrace.new.grep: { .subname ~~ /bad/ } {
fail("Not authorized to call this");
}
};
Run Code Online (Sandbox Code Playgroud)
这只是在定义时运行,也就是什么时候输入?该MAIN范围是什么?这可能是文档错误。很有可能 phaser trait 不能真正应用于变量,但上面,当它实际上是一个块时,它并没有真正运行;当完全独立于值的变量定义的事情发生时,“移相器”就会运行,至少在这种情况下是这样。任何的想法?
您所称的“移相器特性”将与其他同名移相器同时运行。
will变量的特征基本上在其周围范围内设置移相器,变量作为唯一的位置参数传递。所以
my $h will enter { dd $_ };
Run Code Online (Sandbox Code Playgroud)
在功能上等同于:
my $h;
ENTER { dd $h }
Run Code Online (Sandbox Code Playgroud)
在你的例子中:
our &doing-good will enter { ... }
Run Code Online (Sandbox Code Playgroud)
您正在定义一个将传递给指定块的变量 &doing-good。在您的示例中,我没有看到该变量被初始化,因此该块将接收一个Callable类型对象(因为&doing-good如果未初始化,它将包含该对象)。
我的理解是,该will特征与匹配的移相器 \xe2\x80\x93 完全相同,唯一的区别是它可以访问变量作为其主题。因此,下面的代码will enter非常ENTER相似,并且都在进入包含范围时执行。
\nENTER { note "ENTER phaser with topic $_.VAR.WHAT.raku()" }\nmy $a will enter { note "will enter with topic $_.VAR.WHAT.raku()"; $_ = 42 };\n\nnote 'main';\nnote "\\$a: $a";\nRun Code Online (Sandbox Code Playgroud)\n打印:
\nENTER phaser with topic Scalar \nwill enter with topic Scalar \nmain \n$a: 42 \nRun Code Online (Sandbox Code Playgroud)\n换句话说,变量没有发生明显的“进入”阶段;它只是引用ENTER包含范围的阶段。