【发布时间】:2021-11-26 00:26:32
【问题描述】:
Raku 的state declarator 可用于为子例程或其他块提供其自己的本地状态,该状态在函数的多次调用中持续存在:
sub f { state $n++ }
say f; # OUTPUT: «0»
say f; # OUTPUT: «1»
say f; # OUTPUT: «2»
我知道“复制”具有内部状态的函数的两种方法:首先,我可以将其分配给一个新的 &-sigiled 变量,其代码类似于 my &f1 = &f。这导致&f1 实际上是&f 的别名,这意味着它们共享状态——任何改变&f 或&f1 状态的东西也会改变另一个函数的状态。
其次,我可以使用my &f2 = &f.clone 之类的代码创建&f 的clone。这将创建一个独立函数,其状态初始化为 &f 中的任何默认值(即,对于上面的代码,$n 是 Any)。
但是,我正在寻找第三种复制 &f 的方法(如选项 1)将保留 &f 状态的当前值,但(如选项 2)将使该状态独立于 @ 987654338@的。换句话说,我希望能够使用下面被注释掉的行:
sub f { state $n++ }
say f; # OUTPUT: «0»
say f; # OUTPUT: «1»
say f; # OUTPUT: «2»
my &f1 = &f;
my &f2 = &f.clone;
# my &f3 = ???;
say f; # OUTPUT: «3»
say f; # OUTPUT: «4»
say f1; # OUTPUT: «5»
say f2; # OUTPUT: «0»
# say f3; # (desired) OUTPUT: «3»
有没有办法像这样保存&f 的状态(可能有一些我想不到的wrap 或类似的东西)?还是我只是要求做一些目前不可能的事情?
【问题讨论】:
标签: state metaprogramming raku continuations rakudo