如何修复Rust泛型结构体方法返回特定类型时的cannot infer type错误
报错根因
你定义的new_bi、new_an关联函数被写在了带有泛型参数<X,Y>的impl块中:
impl<X, Y> Generate<X, Y> { // 此处的X、Y是属于整个impl块的泛型参数 pub fn new_bi() -> Generate<u16, String> { ... } }
哪怕这两个函数的实现和返回值都完全不依赖impl块的泛型参数X、Y,Rust编译器在调用Generate::new_bi()时,仍然需要先确定X、Y的具体类型才能定位到对应的impl块,而这两个参数没有任何可推断来源,就会抛出类型无法推断的报错。
解决方法
推荐你把固定返回类型的构造函数,拆分到对应具体类型的impl块中,修改后的完整代码如下:
pub struct Generate<X, Y> { pub data_type: X, pub data_config: Y, } // 对应Generate<u16, String>的专属关联函数 impl Generate<u16, String> { pub fn new_bi() -> Self { Self { data_type: 10, data_config: String::from("Hello"), } } } // 对应Generate<String, u16>的专属关联函数 impl Generate<String, u16> { pub fn new_an() -> Self { Self { data_type: String::from("Hello"), data_config: 10, } } } fn main() { let y = Generate::new_bi(); // 不再报错 let y2 = Generate::new_an(); // 正常运行 }
如果你不想拆分impl块,也可以在调用时手动指定impl块的泛型参数(不推荐,写法冗余且无实际意义):
let y = Generate::<(), ()>::new_bi();
内容的提问来源于stack exchange,提问作者Ivan Raul Sanchez Diaz
相关产品推荐
相关产品推荐

