Rust类型转换库try_from的使用,实现安全可控的类型转换与错误处理
Rust类型转换库try_from的使用,实现安全可控的类型转换与错误处理
用于可失败转换的TryFrom和TryInto特性,返回Result类型。
安装
在项目目录中运行以下Cargo命令:
cargo add try_from
或者在Cargo.toml中添加以下行:
try_from = "0.3.2"
示例
use std::convert::TryFrom;
// 定义一个简单的结构体
#[derive(Debug)]
struct Number {
value: i32,
}
// 为Number实现TryFrom<i32>
impl TryFrom<i32> for Number {
type Error = &'static str;
fn try_from(value: i32) -> Result<Self, Self::Error> {
if value >= 0 {
Ok(Number { value })
} else {
Err("Number must be non-negative")
}
}
}
// 为Number实现TryFrom<&str>
impl TryFrom<&str> for Number {
type Error = &'static str;
fn try_from(value: &str) -> Result<Self, Self::Error> {
match value.parse::<i32>() {
Ok(num) => Number::try_from(num),
Err(_) => Err("Failed to parse string as integer"),
}
}
}
fn main() {
// 使用try_from进行安全转换
let num1 = Number::try_from(42);
println!("Number from i32: {:?}", num1);
let num2 = Number::try_from(-5);
println!("Number from negative i32: {:?}", num2);
let num3 = Number::try_from("100");
println!("Number from string: {:?}", num3);
let num4 = Number::try_from("invalid");
println!("Number from invalid string: {:?}", num4);
// 使用try_into进行转换
let value: i32 = 75;
let num5: Result<Number, _> = value.try_into();
println!("Number using try_into: {:?}", num5);
}
完整示例
use std::convert::{TryFrom, TryInto};
// 自定义错误类型
#[derive(Debug)]
enum ConversionError {
NegativeNumber,
ParseError,
OutOfRange,
}
// 范围受限的数字类型
#[derive(Debug)]
struct BoundedNumber {
value: u32,
}
impl TryFrom<i32> for BoundedNumber {
type Error = ConversionError;
fn try_from(value: i32) -> Result<Self, Self::Error> {
if value < 0 {
Err(ConversionError::NegativeNumber)
} else if value > 1000 {
Err(ConversionError::OutOfRange)
} else {
Ok(BoundedNumber {
value: value as u32
})
}
}
}
impl TryFrom<&str> for BoundedNumber {
type Error = ConversionError;
fn try_from(value: &str) -> Result<Self, Self::Error> {
value.parse::<i32>()
.map_err(|_| ConversionError::ParseError)
.and_then(BoundedNumber::try_from)
}
}
fn main() {
// 测试各种转换场景
let test_values = vec![
42,
-5,
1500,
];
for value in test_values {
match BoundedNumber::try_from(value) {
Ok(num) => println!("Success: {:?}", num),
Err(err) => println!("Error converting {}: {:?}", value, err),
}
}
// 测试字符串转换
let test_strings = vec![
"500",
"-10",
"abc",
"2000",
];
for s in test_strings {
match BoundedNumber::try_from(s) {
Ok(num) => println!("Success from '{}': {:?}", s, num),
Err(err) => println!("Error converting '{}': {:?}", s, err),
}
}
// 使用try_into语法
let value: i32 = 999;
let result: Result<BoundedNumber, _> = value.try_into();
match result {
Ok(num) => println!("try_into success: {:?}", num),
Err(err) => println!("try_into error: {:?}", err),
}
}
这个示例展示了如何使用try_from库实现安全可控的类型转换,包括自定义错误处理和多种输入类型的转换。
1 回复