Con*_*nor 1 rust borrow-checker
我有一个 Option 类型的值。如果类型中有一个 Leg 值,我想修改 Leg 结构,然后通过将腿从当前存储的位置移动self._current_leg到self._completed_legs. 然后我想将该_current_leg值设置为堆栈中的下一条腿_expected_legs。但是,我收到了一个类型不匹配的错误,self._completed_legs.push(leg)因为Trip.dropoff()堆栈需要一个 Leg 类型的结构,而我正在传递一个&mut Leg类型。我不知道如何将值移出变量_current_leg——我似乎只能借用该值。
相关代码位于该代码块的底部。谢谢您的帮助。
use std::collections;
pub struct Stack<T> {
maxsize: usize,
items: Vec<T>,
}
impl<T> Stack<T> {
pub fn new(maxsize: usize) -> Self {
Self {
maxsize,
items: Vec::with_capacity(maxsize),
}
}
pub fn pop(&mut self) -> Option<T> {
self.items.pop()
}
pub fn push(&mut self, item: T) -> bool {
if self.items.len() == self.maxsize {
return false;
}
self.items.push(item);
return true;
}
pub fn size(&self) -> usize {
self.items.len()
}
pub fn peek(&self) -> Option<&T> {
self.items.last()
}
}
pub struct Leg {
// not important
_trip_index: usize
}
impl Leg {
fn dropoff(&mut self, time: i64) {
}
fn pickup(&mut self, time: i64) {
}
}
pub struct Trip {
_current_leg: Option<Leg>,
_completed_legs: Stack<Leg>,
_expected_legs: Stack<Leg>
}
impl Trip {
fn dropoff(&mut self, time: i64) {
let leg = self._current_leg.as_mut().unwrap();
leg.dropoff(time);
self._completed_legs.push(leg);
self._current_leg = self._expected_legs.pop();
}
}
Run Code Online (Sandbox Code Playgroud)
你的self._current_leg类型是类型Option<Leg>,但你不能拥有它,因为它是 的一部分self。基本上就好像你有一个&mut Option<Leg>. 您不能调用unwrap(),因为unwrap()它拥有Option.
您解决了这个调用as_mut(),但是将您转换&mut Option<Leg>为 a Option<&mut Leg>:现在您拥有 theOption但它不包含值,只是一个引用,所以您仍然不拥有它Leg本身。
你需要的是Option::take():
pub fn take(&mut self) -> Option<T>
Run Code Online (Sandbox Code Playgroud)
它将替换给定值并None返回之前的值。像这样的事情将在您的代码中起作用:
let mut leg = self._current_leg.take().unwrap();
Run Code Online (Sandbox Code Playgroud)