编写一个RUST程序 结合所有权、借用与生命周期,实现一个结构体,用于管理一个字符串列表,并提供添加、获取最长字符串以及其长度、获取最短字符串以及其长度、的功能。
时间: 2024-10-07 08:07:21 浏览: 45
温和的介绍:一个温和的Rust教程
在 Rust 中,我们可以通过结合所有权 (ownership)、借用 (borrowing) 和生命周期 (lifetimes) 来实现这个功能。首先,我们需要创建一个 `StringList` 结构体,它包含一个动态大小的 `Vec` 保存字符串,并维护两个变量分别存储最长和最短的字符串及其长度。
```rust
use std::collections::Vec;
struct StringList {
strings: Vec<String>,
longest_string: Option<&str>, // 通过引用保持最长字符串
longest_length: u32,
shortest_string: Option<&str>, // 通过引用保持最短字符串
shortest_length: u32,
}
impl StringList {
fn new() -> Self {
StringList {
strings: Vec::new(),
longest_string: None,
longest_length: 0,
shortest_string: None,
shortest_length: u32::MAX, // 初始化为最大的整数以确保初始是最长
}
}
fn add_string(&mut self, s: &str) {
// 借用推导自动处理了生命周期
let len = s.len();
if len > self.longest_length {
self.longest_string = Some(s);
self.longest_length = len;
}
if len < self.shortest_length {
self.shortest_string = Some(s);
self.shortest_length = len;
}
self.strings.push(s.to_string());
}
fn get_longest_string(&self) -> Option<&str> {
self.longest_string
}
fn get_longest_length(&self) -> u32 {
self.longest_length
}
fn get_shortest_string(&self) -> Option<&str> {
self.shortest_string
}
fn get_shortest_length(&self) -> u32 {
self.shortest_length
}
}
```
在这个实现中,`add_string` 方法会更新最长和最短字符串的信息,同时将新字符串添加到 `strings` 集合。注意,因为我们需要保持对最长和最短字符串的引用,所以它们都存储为 `Option<&str>` 类型,表示可能不存在(None)。访问这些信息时需要检查 `Some` 是否存在。
现在你可以使用这个 `StringList` 结构了:
```rust
fn main() {
let list = StringList::new();
list.add_string("short");
list.add_string("medium");
list.add_string("longest string ever");
println!("Longest string: {}", list.get_longest_string().unwrap()); // 输出 "longest string ever"
println!("Length of longest: {}", list.get_longest_length()); // 输出 27
println!("Shortest string: {}", list.get_shortest_string().unwrap()); // 输出 "short"
println!("Length of shortest: {}", list.get_shortest_length()); // 输出 5
}
```
阅读全文