Rust 中的自递归函数类型
self recursive function type in rust
只是好奇:在python
def f(x):
print(x)
return f
但我不知道如何用 Rust 编写它。
fn f(x:i32) -> ?{
println!("{}", x);
?
}
我不相信你能用 fn
项做到这一点。
fn f(x: i32) -> fn() -> ...
和fn f(x: i32) -> impl Fn() -> ...
在这里都没有用,因为你不能命名return类型的return类型。
尝试定义类型别名 type F = fn(i32) -> F
也无法解决问题,因为它会导致循环错误,并且您不能在类型别名中使用 Self
。
我认为唯一的方法是使用nightly-only特性来为一个结构体实现家族的Fn
特征,从而在实现Fn
时能够命名它:
#![feature(unboxed_closures, fn_traits)]
struct F;
impl FnOnce<(i32,)> for F {
type Output = F;
extern "rust-call" fn call_once(self, args: (i32,)) -> Self::Output {
self.call(args)
}
}
impl FnMut<(i32,)> for F {
extern "rust-call" fn call_mut(&mut self, args: (i32,)) -> Self::Output {
self.call(args)
}
}
impl Fn<(i32,)> for F {
extern "rust-call" fn call(&self, (x,): (i32,)) -> Self::Output {
println!("{}", x);
Self
}
}
这个问题的缺点是你不能真正得到一个fn(i32) -> Self
,只有一个fn(i32) -> F
,你不能F
“实现”fn(i32) -> F
, 因为它不是特征。
综上所述,这可能是个坏主意,只是出于好奇才真正有用
只是好奇:在python
def f(x):
print(x)
return f
但我不知道如何用 Rust 编写它。
fn f(x:i32) -> ?{
println!("{}", x);
?
}
我不相信你能用 fn
项做到这一点。
fn f(x: i32) -> fn() -> ...
和fn f(x: i32) -> impl Fn() -> ...
在这里都没有用,因为你不能命名return类型的return类型。
尝试定义类型别名 type F = fn(i32) -> F
也无法解决问题,因为它会导致循环错误,并且您不能在类型别名中使用 Self
。
我认为唯一的方法是使用nightly-only特性来为一个结构体实现家族的Fn
特征,从而在实现Fn
时能够命名它:
#![feature(unboxed_closures, fn_traits)]
struct F;
impl FnOnce<(i32,)> for F {
type Output = F;
extern "rust-call" fn call_once(self, args: (i32,)) -> Self::Output {
self.call(args)
}
}
impl FnMut<(i32,)> for F {
extern "rust-call" fn call_mut(&mut self, args: (i32,)) -> Self::Output {
self.call(args)
}
}
impl Fn<(i32,)> for F {
extern "rust-call" fn call(&self, (x,): (i32,)) -> Self::Output {
println!("{}", x);
Self
}
}
这个问题的缺点是你不能真正得到一个fn(i32) -> Self
,只有一个fn(i32) -> F
,你不能F
“实现”fn(i32) -> F
, 因为它不是特征。
综上所述,这可能是个坏主意,只是出于好奇才真正有用