Rust中如何用函数生成含闭包的泛型Problem结构体?
Rust闭包构造泛型结构体的返回类型问题解决方法
首先修正你代码中的类型别名错误:原代码里的type Complex<f64> = ClxD;写法错误,正确的别名定义应该是:
type ClxD = Complex<f64>;
针对你遇到的make_quadratic_problem函数返回类型无法显式声明的问题,有两种常用解决方案:
方案一:使用impl Trait作为返回类型(推荐)
Rust 1.26及以上支持在函数返回位置使用impl Trait,用来表示实现了指定trait的匿名类型(比如闭包),既保留静态分派的性能优势,又不用写冗长的闭包类型。
修改后的完整代码:
use num::complex::Complex; type ClxD = Complex<f64>; struct Problem<F, D> where F: Fn(ClxD) -> ClxD, D: Fn(ClxD) -> ClxD, { pub f: F, pub f_derive: D, } impl<F,D> Problem<F,D> where F: Fn(ClxD) -> ClxD, D: Fn(ClxD) -> ClxD, { fn new(f:F, f_derive: D) -> Self { Self {f, f_derive} } } fn make_quadratic_problem(root_1: ClxD, root_2: ClxD) -> Problem<impl Fn(ClxD) -> ClxD, impl Fn(ClxD) -> ClxD> { Problem::new( // 必须加move,将root_1/root_2的所有权转移到闭包中 move |c| (c - root_1) * (c - root_2), move |c| c * c - (root_1 + root_2) ) }
注意:闭包前必须加move关键字,因为函数参数root_1和root_2在函数返回后会被销毁,闭包需要捕获它们的所有权才能继续存在。
方案二:使用Trait Object(装箱动态分派)
如果需要统一不同函数返回的Problem类型(比如多个函数返回相同类型的Problem结构体),可以将闭包装箱为Box<dyn Fn(ClxD) -> ClxD> trait对象,此时返回类型是具体的Problem<Box<dyn...>, Box<dyn...>>。
代码示例:
fn make_quadratic_problem(root_1: ClxD, root_2: ClxD) -> Problem<Box<dyn Fn(ClxD) -> ClxD>, Box<dyn Fn(ClxD) -> ClxD>> { Problem::new( Box::new(move |c| (c - root_1) * (c - root_2)), Box::new(move |c| c * c - (root_1 + root_2)) ) }
这种方式会引入动态分派开销(运行时查找函数地址),适合对性能要求不高或需要类型统一的场景。
对比C++的auto
Rust的impl Trait在返回位置的作用类似C的auto,但Rust的规则更严格:impl Trait表示返回的是单一具体类型,而C的auto可以在不同分支返回不同类型(只要能被推导)。
内容的提问来源于stack exchange,提问作者Lionishy
相关产品推荐
相关产品推荐

