移相器特性何时运行?

jjm*_*elo 6 traits raku

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 不能真正应用于变量,但上面,当它实际上是一个块时,它并没有真正运行;当完全独立于值的变量定义的事情发生时,“移相器”就会运行,至少在这种情况下是这样。任何的想法?

Eli*_*sen 5

您所称的“移相器特性”将与其他同名移相器同时运行。

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如果未初始化,它将包含该对象)。


cod*_*ons 3

我的理解是,该will特征与匹配的移相器 \xe2\x80\x93 完全相同,唯一的区别是它可以访问变量作为其主题。因此,下面的代码will enter非常ENTER相似,并且都在进入包含范围时执行。

\n
\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";\n
Run Code Online (Sandbox Code Playgroud)\n

打印:

\n
ENTER phaser with topic Scalar                                                                                                \nwill enter with topic Scalar                                                                                                   \nmain                                                                                                                           \n$a: 42   \n
Run Code Online (Sandbox Code Playgroud)\n

换句话说,变量没有发生明显的“进入”阶段;它只是引用ENTER包含范围的阶段。

\n