不能在内部函数中使用外部类型参数的基本原理是什么?

Erl*_*ch 4 rust

我正在尝试创建一个递归内部函数,它将打印链表中的所有元素:

 fn print_stack(&self) {
    fn print_nodes(head: &Option<Box<Node<T>>>) {
        match head {
            Some(ref p) => {
                println!("{:?}",p.data);
                print_nodes(head.next);
            },
        }
   };
   print_nodes(&self.head);
}
Run Code Online (Sandbox Code Playgroud)

编译器生成以下错误

can't use type parameters from outer function; try using a local  type parameter instead.
Run Code Online (Sandbox Code Playgroud)

为什么这是一个错误?

小智 6

来自Rust编译器错误索引:

E0401

内部项不会从嵌入的函数继承类型参数.

[...]

函数内部的项目基本上就像顶级项目,除了它们只能从它们所在的函数中使用.

有几个解决方案.

[...]

对于通用项目,您可以复制参数:

[...]

我将从中得出结论,函数内的项目也被编译为顶级项目.允许引用外部函数类型参数将允许两个具有相同名称的不同函数定义,而函数本身没有任何类型参数来消除歧义,因此需要更改名称修改.制作一个小测试程序证实了这一点:

struct Foo<T>(T);
impl <T> Foo<T> {
    pub fn bar() {
        fn baz() { }
        baz();
    }
}
fn main() {
    Foo::<i32>::bar();
    Foo::<u32>::bar();
}
Run Code Online (Sandbox Code Playgroud)

编译它并调用nm生成的输出显示了两个定义bar和一个定义baz.

可以按照您期望的方式更改Rust,但是需要首先进行设计,并且感知到的好处必须超过实现它的成本.鉴于可用的解决方法,感知的好处可能很小.在您的情况下,如该页面所示,解决方法是指定内部函数的类型参数.