我正在尝试创建一个递归内部函数,它将打印链表中的所有元素:
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.
为什么这是一个错误?
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,但是需要首先进行设计,并且感知到的好处必须超过实现它的成本。鉴于可用的解决方法,感知的好处可能很小。在您的情况下,如该页面所示,解决方法是指定内部函数的类型参数。