在Rob Pike谈到 Go中的词法扫描时,他定义了一个stateFn返回另一个的函数类型stateFn,如下所示:
type stateFn func() stateFn
Run Code Online (Sandbox Code Playgroud)
为了尝试在Rust中做类似的事情,我尝试了这个:
type stateFn = fn() -> stateFn;
Run Code Online (Sandbox Code Playgroud)
但编译器抱怨"非法递归类型;如果需要,在循环中插入枚举或结构".
我可以在Rust中执行此操作,如果是这样,怎么做?
我想将一个函数的地址赋给一个函数指针,但是要处理的函数返回一个与自身具有相同签名的函数指针,导致它以一种我根本无法写入返回类型的方式递归,因为函数指针甚至函数声明本身......
我想一种简化问题的方法,所以它不会混淆:
我怎么能写一个函数声明,它可以返回一个指向自身的指针(或任何其他具有相同签名的函数)?
????? function(int a){
// could be this function, or another with the same signature,
return arbitraryFunction;
}
?????(*func)(int) = function; // same problem as above
Run Code Online (Sandbox Code Playgroud)
编辑:
现在我有一个解决方案,但我不会将其作为答案发布,因为它非常难看.它通过简单地返回原始void*指针作为返回类型来消除递归,并最终采用以下形式:
void* function(int parameter){
return arbitraryFunction; // of the same signature
}
void*(*func)(int) = function;
func = reinterpret_cast<void*(*)(int)>(func(42)); // sin
Run Code Online (Sandbox Code Playgroud)
EDIT2:
似乎在函数指针和常规指针之间进行转换是UB,所以void*在这种情况下我无法使用...
要回答其中一条注释,这是为了在程序中的多个"主"循环之间传递控制,每个循环都获得它自己的功能.有很多方法可以做到这一点,但返回函数指针(或NULL来终止程序)mid-loop 似乎是最简单的方法,但我没想到指向数据的指针和指向函数地址的指针与每个指针都不相容其他.我认为在这种情况下,返回多态函数对象将最终成为更合理的选项.