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
    }
}

Playground

这个问题的缺点是你不能真正得到一个fn(i32) -> Self,只有一个fn(i32) -> F,你不能F“实现”fn(i32) -> F, 因为它不是特征。

综上所述,这可能是个坏主意,只是出于好奇才真正有用