访问Vec或切片的最后一个元素

Dav*_*ogt 9 vector rust

我有一些看起来像这样的代码:

trait Stack {
    fn top(&mut self) -> Option<f64>;
}

impl Stack for Vec<f64> {
    fn top(&mut self) -> Option<f64> {
        match self.pop() {
            None => None,
            Some(v) => {
                self.push(v);
                Some(v)
            }
        }
    }
}

fn main() {
    let mut stack: Vec<f64> = Vec::new();
    stack.push(5.3);
    stack.push(2.3);
    stack.push(1.3);

    match stack.top() {
        Some(v) => println!("Top of the stack: {}", v),
        None => println!("The stack is empty"),
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,该top()方法正在修改self,但我认为这不应该是必要的.显而易见的方法并没有真正起作用:

fn top(&mut self) -> Option<f64> {
    match self.len() {
        0 => None,
        n => self[n - 1],
    }
}
Run Code Online (Sandbox Code Playgroud)

我逛了一下玩弄转换usizei32背部,但我想应该没有,我写的东西看起来短和可读性.

She*_*ter 17

您还可以使用slice::last:

fn top(&mut self) -> Option<f64> {
    self.last().cloned()
}
Run Code Online (Sandbox Code Playgroud)

Option::cloned用于从a转换Option<&f64>为a Option<f64>,匹配所需的函数签名.

您还可以mut从实现和特征定义中删除它们.


Dav*_*ogt 10

在发布问题之后,答案显而易见:

fn top (&mut self) -> Option<&f64> {
    match self.len() {
        0 => None,
        n => Some(&self[n-1])
    }
}
Run Code Online (Sandbox Code Playgroud)

usize从来没有问题 - 返回类型top()是.