访问 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
。
我有一些代码如下所示:
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
。