Rust 递归函数类型

Rust 递归函数类型,rust,Rust,在Go中的on词法扫描中,他定义了一个函数类型stateFn,它返回另一个stateFn,如下所示: type stateFn func() stateFn 为了在Rust中做类似的事情,我尝试了以下方法: type stateFn = fn() -> stateFn; 但是编译器抱怨“非法递归类型;如果需要,在循环中插入枚举或结构” 我可以在Rust中执行此操作吗?如果可以,如何执行?您可以将函数类型包装为标称类型(即结构或枚举)。这实际上就是Go代码所做的:typetu定义了一个新

在Go中的on词法扫描中,他定义了一个函数类型
stateFn
,它返回另一个
stateFn
,如下所示:

type stateFn func() stateFn
为了在Rust中做类似的事情,我尝试了以下方法:

type stateFn = fn() -> stateFn;
但是编译器抱怨“非法递归类型;如果需要,在循环中插入枚举或结构”


我可以在Rust中执行此操作吗?如果可以,如何执行?

您可以将函数类型包装为标称类型(即结构或枚举)。这实际上就是Go代码所做的:
typetu
定义了一个新的、不同的类型
T
,它不能与
U
直接交换,而Rust的
type
只是一个别名,就像Haskell中的
type
和C中的
typedef

因此,有人可能会写道:

struct StateFn(fn() -> Option<StateFn>);
以下任何情况的分析循环可能如下所示:

let mut state_fn = Some(initial_fn);
while let Some(mut f) = state_fn {
    state_fn = (*f.f)()
}

Fn对调用者施加了最多的限制(不得改变环境),FnOnce甚至可以使用/移动环境。FNNONCE为FnMut实现,FnMut为Fn实现。我认为FnOnce最适合这里。不,调用者对
Fn
的限制最少:例如,他们可以通过
&Fn()
调用它,但是
FnMut
FnOnce
都不能在那里调用,而
FnOnce
必须按值调用,并且只能调用一次(这限制性要大得多)。另一方面,
Fn
对被调用方的限制最大(闭包本身),而
FnOnce
对闭包的限制最小(即
FnOnce
闭包的主体具有最大的灵活性)。正如答案所描述的,
FnOnce
是最好的,但是特质对象的一些微妙之处意味着它不能直接工作。是的,你是对的。我想到了一个以FnOnce/FnMut/Fn为参数的函数。
struct StateFn {
    f: Box<FnMut() -> Option<StateFn>>
}
let mut state_fn = Some(initial_fn);
while let Some(mut f) = state_fn {
    state_fn = (*f.f)()
}