从函数到定义为可变引用的变量的赋值?

问题描述 投票:0回答:1

我正在尝试实现 ode_solvers 箱来整合我的方程组。为此,我有一个函数来计算 dydx 是什么,然后我在系统的实现中调用它,如文档中描述的示例

type State = DVector<f64>;

impl ode_solvers::System<State> for NBody {
    fn system<'a>(&self, _t: Time, y: &State, mut dy: &'a mut State) {
        
        dy = get_derivatives(y, &self.masses, self.n_objects)
    }
}

当我这样做时,我会收到类型不匹配错误,因为函数 getderivative 输出 State 类型,但 dy 需要 &mut State。 但是,如果我将函数的输出更改为可变引用,那么我会遇到我不知道如何解决的生命周期问题。 最后我不断收到一个错误,我无法将其分配给不可变的 dy。

文档中的示例显示了这一点 -

impl ode_solvers::System<State> for KeplerOrbit {
    // Equations of motion of the system
    fn system(&self, _t: Time, y: &State, dy: &mut State) {
        let r = (y[0] * y[0] + y[1] * y[1] + y[2] * y[2]).sqrt();

        dy[0] = y[3];
        dy[1] = y[4];
        dy[2] = y[5];
        dy[3] = - self.mu * y[0] / r.powi(3);
        dy[4] = - self.mu * y[1] / r.powi(3);
        dy[5] = - self.mu * y[2] / r.powi(3);
    }
}

我认为该示例工作正常,因为分配的每个值都已为其实现了副本,但我的分配本身是 vec,因此不清楚如何解决此问题。

rust immutability traits lifetime ode
1个回答
0
投票

我找到了解决方案 -

fn system(&self, _t: Time, y: &State, dy: &mut State) {
        let out = get_derivatives(y.clone(), &self.masses, self.n_objects);
        for i in 0..y.len() {dy[i] = out[i];}
    }
© www.soinside.com 2019 - 2024. All rights reserved.