我可以复制具有*当前*状态的函数吗?
Can I copy a function with its *current* state?
Raku 的 state declarator 可用于为子程序或其他块提供其自己的本地状态,该状态在函数的多次调用中持续存在:
sub f { state $n++ }
say f; # OUTPUT: «0»
say f; # OUTPUT: «1»
say f; # OUTPUT: «2»
我知道有两种方法可以“复制”具有内部状态的函数:首先,我可以使用 my &f1 = &f
之类的代码将其分配给一个新的 &
-sigiled 变量。这导致 &f1
实际上成为 &f
的别名,意味着它们共享状态——任何改变 &f
或 &f1
状态的东西也会改变其他函数的状态。
其次,我可以使用像 my &f2 = &f.clone
这样的代码制作 &f
的 clone。这将创建一个独立的函数,其状态初始化为 &f
中的任何默认值(即,对于上面的代码,$n
为 Any
)。
但是,我正在寻找第三种复制 &f
的方法,它(如选项 1)将保留 &f
状态的当前值,但(如选项 2)会使该状态独立于 &f
。换句话说,我希望能够使用下面注释掉的行:
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 的一些花哨的东西或我想不到的类似东西)?或者我只是要求做一些目前不可能的事情?
不,没有办法——即使有人愿意编写一个依赖于不受支持的 Rakudo 内部组件的模块。
状态变量目前在运行时(通常是 MoarVM)一直向下处理,它们附加到字节码句柄。依次克隆 Block
会克隆底层字节码句柄,即 explicitly does not clone the state variables.
Raku 的 state declarator 可用于为子程序或其他块提供其自己的本地状态,该状态在函数的多次调用中持续存在:
sub f { state $n++ }
say f; # OUTPUT: «0»
say f; # OUTPUT: «1»
say f; # OUTPUT: «2»
我知道有两种方法可以“复制”具有内部状态的函数:首先,我可以使用 my &f1 = &f
之类的代码将其分配给一个新的 &
-sigiled 变量。这导致 &f1
实际上成为 &f
的别名,意味着它们共享状态——任何改变 &f
或 &f1
状态的东西也会改变其他函数的状态。
其次,我可以使用像 my &f2 = &f.clone
这样的代码制作 &f
的 clone。这将创建一个独立的函数,其状态初始化为 &f
中的任何默认值(即,对于上面的代码,$n
为 Any
)。
但是,我正在寻找第三种复制 &f
的方法,它(如选项 1)将保留 &f
状态的当前值,但(如选项 2)会使该状态独立于 &f
。换句话说,我希望能够使用下面注释掉的行:
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 的一些花哨的东西或我想不到的类似东西)?或者我只是要求做一些目前不可能的事情?
不,没有办法——即使有人愿意编写一个依赖于不受支持的 Rakudo 内部组件的模块。
状态变量目前在运行时(通常是 MoarVM)一直向下处理,它们附加到字节码句柄。依次克隆 Block
会克隆底层字节码句柄,即 explicitly does not clone the state variables.