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

时间:2015-02-02 14:33:06

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

目前,top()方法正在修改self,但我认为这不是必需的。显而易见的方法并没有真正起作用:

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

我将usize转换为i32然后回来玩了一下,但我所写的内容看起来并不像我认为的那么简短和可读。

2 个答案:

答案 0 :(得分:13)

您还可以使用slice::last

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

Option::cloned用于将Option<&f64>转换为Option<f64>,与所需的函数签名匹配。

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

答案 1 :(得分:10)

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

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

即。 usize永远不是问题 - top()的返回类型是。