私はこのようなコードをいくつか持っています:
_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
_に変換したり、元に戻したりすることを少しいじってみましたが、私が書いているものはどれも、思ったほど短くて読みやすいものではありません。
そして、質問を投稿した直後、答えは明白であるように見えます:
_fn top (&mut self) -> Option<&f64> {
match self.len() {
0 => None,
n => Some(&self[n-1])
}
}
_
つまりusize
は決して問題ではありませんでした-top()
の戻り値の型は問題でした。
slice::last
を使用することもできます:
fn top(&mut self) -> Option<f64> {
self.last().cloned()
}
Option::cloned
は、目的の関数シグネチャに一致するOption<&f64>
からOption<f64>
に変換するために使用されます。
実装とトレイト定義の両方からmut
を削除することもできます。