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

Accessing the last element of a Vec or a slice

我有一些代码如下所示:

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"),
    }
}

现在,top() 方法正在修改 self,但我认为这应该没有必要。显而易见的方法并没有真正奏效:

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

我试过将 usize 转换为 i32 并返回,但是我正在写的 none 看起来像我认为的那样简短易读.

发布问题后,答案似乎显而易见:

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

usize 从来都不是问题 - return 类型的 top() 才是。

您可以使用 slice::last:

fn top(&mut self) -> Option<f64> {
    self.last().copied()
}

Option::copied (and Option::cloned) 可用于从 Option<&f64> 转换为 Option<f64>,匹配所需的函数签名。

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