如何在内部枚举中复用外部函数的泛型参数?
问题
我有一个带泛型参数的测试函数:
fn my_func()<G: A + B + C>() { let my_val = Val::<G>::new(); // 可以正常执行 // 由于G已在my_func()中定义且实现了A + B + C,我想复用它 enum MyEnum<G> { First(FirstValue<G>), // 需要实现A + B + C trait Second(SecondValue<G>), // 需要实现A + B + C trait } }
但该枚举触发编译错误:trait bound A must be implemented for FirstValue
进一步排查得到编译器错误:can't use generic parameters from outer function use of generic parameter from outer function
如何在不单独为枚举重新定义G的前提下解决该问题?
解决方法
Rust不允许嵌套定义的类型(比如函数内的枚举)直接复用外部函数的泛型参数——你写enum MyEnum<G>其实是重新声明了一个和外部同名的独立泛型参数,而非复用外部已带约束的G。
要复用外部的泛型参数,只需去掉嵌套枚举的泛型声明,直接使用外部的G即可:
fn my_func()<G: A + B + C>() { let my_val = Val::<G>::new(); // 去掉枚举的泛型声明,直接使用外部函数的G enum MyEnum { First(FirstValue<G>), Second(SecondValue<G>), } }
这种写法下,枚举会自动捕获外部函数的泛型参数G,同时继承G的A + B + C约束,编译器就能正确识别FirstValue<G>和SecondValue<G>满足所需的trait要求。
内容的提问来源于stack exchange,提问作者NewToCode
相关产品推荐
相关产品推荐

