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

wi3ka0sx  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(97)

我试图实现ode_solvers crate来整合我的方程组。为此,我有一个函数来计算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)
    }
}

字符串
当我这样做的时候,我会得到类型不匹配的错误,因为函数get derivatives输出一个State类型,但dy需要一个&mut State。但是如果我把函数的输出改为一个可变的引用,那么我会得到一个生命周期问题,我不知道如何解决。最后我会得到一个错误,我不能把它分配给不可变的dy。
documents中的示例显示了这一点-

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,所以不清楚如何解决这个问题。

rks48beu

rks48beu1#

我找到了解决办法-

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

字符串

ctehm74n

ctehm74n2#

当你想把一个可变的引用所指向的东西赋值给时,你必须解引用它;否则你就是在试图替换局部变量中的引用,即使你成功了也没有用。这两行:

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

字符串
应该被

fn system<'a>(&self, _t: Time, y: &State, dy: &'a mut State) {
    ...
    *dy = get_derivatives(y, &self.masses, self.n_objects);


*dy = ...中添加的解引用操作符*就是你所需要的。还要注意的是,变量dy不需要声明为mut(因为你没有重新分配引用本身)。
在访问向量元素dy[i]时不会发生这种情况的原因是索引操作符内置了一个解引用;它扩展到大约*IndexMut::index_mut(&mut dy, i),额外的&mut由deref强制处理。(一般来说,由于deref强制,您通常可以忽略 * 额外的引用层 *,如&&Foo&mut &mut Foo,但是你需要注意特定类型和任何对它的引用之间的区别。

相关问题