我是新来的。
我遇到了一个泛型的问题。我想用一个函数从两个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); }
);
}
型
1条答案
按热度按时间gv8xihay1#
我们可以在返回类型中使用
impl Trait
形式。此外,我们需要在闭包上使用
move
,以防止引用root_1
和root_2
,这在make_quadratic_problem()
之后将不存在。因为
num::complex::Complex<f64>
是Copy
,复制自然发生(而不是移动),就像整数或实数一样。请注意,您颠倒了
type
声明。字符串