web-dev-qa-db-ja.com

Vecまたはスライスの最後の要素へのアクセス

私はこのようなコードをいくつか持っています:

_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_に変換したり、元に戻したりすることを少しいじってみましたが、私が書いているものはどれも、思ったほど短くて読みやすいものではありません。

12
Dave Vogt

そして、質問を投稿した直後、答えは明白であるように見えます:

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

つまりusizeは決して問題ではありませんでした-top()の戻り値の型は問題でした。

10
Dave Vogt

slice::last を使用することもできます:

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

Option::cloned は、目的の関数シグネチャに一致するOption<&f64>からOption<f64>に変換するために使用されます。

実装とトレイト定義の両方からmutを削除することもできます。

15
Shepmaster