我试图实现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,所以不清楚如何解决这个问题。
2条答案
按热度按时间rks48beu1#
我找到了解决办法-
字符串
ctehm74n2#
当你想把一个可变的引用所指向的东西赋值给时,你必须解引用它;否则你就是在试图替换局部变量中的引用,即使你成功了也没有用。这两行:
字符串
应该被
型
在
*dy = ...
中添加的解引用操作符*
就是你所需要的。还要注意的是,变量dy
不需要声明为mut
(因为你没有重新分配引用本身)。在访问向量元素
dy[i]
时不会发生这种情况的原因是索引操作符内置了一个解引用;它扩展到大约*IndexMut::index_mut(&mut dy, i)
,额外的&mut
由deref强制处理。(一般来说,由于deref强制,您通常可以忽略 * 额外的引用层 *,如&&Foo
和&mut &mut Foo
,但是你需要注意特定类型和任何对它的引用之间的区别。