Rust:生成泛型结构的函数

0g0grzrc  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(136)

我是新来的。
我遇到了一个泛型的问题。我想用一个函数从两个lambda表达式(闭包)构造一个泛型结构。我有代码:

use num::complex::Complex;
    type Complex<f64> = ClxD;

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

字符串
现在我需要一个函数来为我生成一个Problem struct形式的带有两个根的二次多项式。根据Rust类型检查的思想,我必须显式地声明一个函数的返回类型。而我在这里卡住了!

fn make_quadratic_problem(root_1: ClxD, root_2: ClxD) -> Problem<???,???> {
        Problem::new(|c| { (c - root_1) * (c - root_2) }, |c| { c * c - (root_1 + root_2) }
    }


是否有任何变通方法?
P.S.如果它可能有帮助,有原始的C++代码:

template<typename T, typeanme D>
struct Problem {
    F f;
    D f_derive;
    Problem(F &&f, D &&f_derive): f(std::forward<F>(f)), f_derive(std::forward<D>(f_derive)) { }
};

auto make_quadratic_problem(std::complex<double> const &root_1, std::complex<double> const &root_2) {
    return Problem(
        [root_1, root_2](std::complex<double> const &c) { return (c - root_1) * (c - root_2); },
        [root_1, root_2](std::complex<double> const &c) { return c * c - (root_1 + root_2); }
    );
}

gv8xihay

gv8xihay1#

我们可以在返回类型中使用impl Trait形式。
此外,我们需要在闭包上使用move,以防止引用root_1root_2,这在make_quadratic_problem()之后将不存在。
因为num::complex::Complex<f64>Copy,复制自然发生(而不是移动),就像整数或实数一样。
请注意,您颠倒了type声明。

type ClxD = Complex<f64>;

fn make_quadratic_problem(
    root_1: ClxD,
    root_2: ClxD,
) -> Problem<impl Fn(ClxD) -> ClxD, impl Fn(ClxD) -> ClxD> {
    Problem::new(
        move |c| (c - root_1) * (c - root_2),
        move |c| c * c - (root_1 + root_2),
    )
}

字符串

相关问题