Rust fallible_collections的使用:可回退的集合操作库,提供内存不足等场景的优雅错误处理
Rust fallible_collections的使用:可回退的集合操作库,提供内存不足等场景的优雅错误处理
Fallible Collections.rs
在Rust集合上实现了API,当发生分配错误时优雅地返回Result
。
这很大程度上受到了RFC 2116的启发。
有用于Vec
、Box
、BTree
、HashMap
的可回退接口的API,
以及一个为原始Rust特性实现的TryClone
特性和一个可回退的格式化宏。
您可以使用try_clone_derive
crate为您的类型派生TryClone
。
开始使用
fallible_collections
可在crates.io上获得。
建议在那里查看最新发布的版本,以及最新文档构建的链接。
将以下依赖项添加到您的Cargo清单中:
[dependencies]
fallible_collections = "0.5"
# 或
fallible_collections = { version = "0.5", features = ["std"] }
…并查看文档以了解如何使用它。
示例
使用FallibleBox
接口的示例。
use fallible_collections::FallibleBox;
fn main() {
// 创建一个普通的Box,但在分配失败时返回错误
let mut a = <Box<_> as FallibleBox<_>>::try_new(5).unwrap();
let mut b = Box::new(5);
assert_eq!(a, b);
*a = 3;
assert_eq!(*a, 3);
}
使用FallibleVec
接口的示例。
use fallible_collections::FallibleVec;
fn main() {
// 创建一个普通的Vec<Vec<u8>>,但在分配失败时返回错误
let a: Vec<Vec<u8>> = try_vec![try_vec![42; 10].unwrap(); 100].unwrap();
let b: Vec<Vec<u8>> = vec![vec![42; 10]; 100];
assert_eq!(a, b);
assert_eq!(a.try_clone().unwrap(), a);
...
}
完整示例代码
// 使用 fallible_collections 库的完整示例
use fallible_collections::{FallibleBox, FallibleVec, try_vec};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// FallibleBox 示例
// 尝试创建一个 Box,分配失败时返回错误
let mut fallible_box = <Box<i32> as FallibleBox<i32>>::try_new(42)?;
println!("FallibleBox value: {}", *fallible_box);
// 修改 Box 中的值
*fallible_box = 100;
println!("Modified FallibleBox value: {}", *fallible_box);
// FallibleVec 示例
// 使用宏创建可回退的 Vec
let fallible_vec: Vec<Vec<u8>> = try_vec![
try_vec![1, 2, 3]?,
try_vec![4, 5, 6]?,
try_vec![7, 8, 9]?
]?;
println!("FallibleVec contents:");
for (i, inner_vec) in fallible_vec.iter().enumerate() {
println!(" Vec {}: {:?}", i, inner_vec);
}
// 尝试克隆 Vec
let cloned_vec = fallible_vec.try_clone()?;
assert_eq!(fallible_vec, cloned_vec);
println!("Clone successful!");
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_fallible_box() {
let box_result = <Box<i32> as FallibleBox<i32>>::try_new(123);
assert!(box_result.is_ok());
assert_eq!(*box_result.unwrap(), 123);
}
#[test]
fn test_fallible_vec() {
let vec_result: Result<Vec<Vec<u8>>, _> = try_vec![
try_vec![1, 2, 3].unwrap(),
try_vec![4, 5, 6].unwrap()
];
assert!(vec_result.is_ok());
let vec = vec_result.unwrap();
assert_eq!(vec, vec![vec![1, 2, 3], vec![4, 5, 6]]);
}
}
许可证
根据以下任一许可证授权:
- Apache License, Version 2.0
- MIT license
由您选择。
贡献
除非您明确声明,否则任何有意提交包含在作品中的贡献, 如Apache-2.0许可证中所定义,均应按照上述双重许可,不附加任何额外条款或条件。
1 回复