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

omvjsjqw  于 2023-02-23  发布在  其他
关注(0)|答案(1)|浏览(123)

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

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

编译器生成以下错误:

can't use type parameters from outer function; try using a local type parameter instead.

为什么这是一个错误?

0vvn1miw

0vvn1miw1#

来自Rust编译器错误索引:

E0401

内部项不从其嵌入的函数继承类型参数。
[...]
函数中的项基本上与顶级项相同,只是它们只能在其所在的函数中使用。
有几个解决方案。
[...]
对于通用物料,您可以复制以下参数:
[...]
我由此得出结论,函数内部的项也被编译为顶级项。允许引用外部函数类型参数将允许两个不同的函数定义具有相同的名称,而函数本身没有任何类型参数来消除歧义,因此需要对名称进行修改。制作一个小的测试程序证实了这一点:

struct Foo<T>(T);
impl <T> Foo<T> {
    pub fn bar() {
        fn baz() { }
        baz();
    }
}
fn main() {
    Foo::<i32>::bar();
    Foo::<u32>::bar();
}

编译该代码并在生成的输出上调用nm,将显示bar的两个定义和baz的一个定义。
可以按您期望的方式更改Rust,但首先需要进行设计,并且实现它的预期收益必须大于成本。如果有可用的变通方法,预期收益可能很小。在您的情况下,如该页所示,变通方法是同时为内部函数指定类型参数。

相关问题