我有一些看起来像这样的代码:
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)
我逛了一下玩弄转换usize到i32背部,但我想应该没有,我写的东西看起来短和可读性.
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()是.
| 归档时间: |
|
| 查看次数: |
13208 次 |
| 最近记录: |