Rust:将值从选项中移出并推入堆栈

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)

rod*_*igo 5

你的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)