1. Rust类型转换基础:as关键字的正确使用姿势
在Rust中,类型转换最基础的方式就是使用as关键字。这个操作符不仅能用于基本类型的转换,还能在导入重命名时发挥作用。让我们从一个实际案例开始:
rust复制fn average(values: &[f64]) -> f64 {
let total = values.iter().sum::<f64>();
total / values.len() as f64 // 关键转换点
}
这里有个容易踩坑的地方:values.len()返回的是usize类型,如果不做类型转换直接除,Rust会报类型不匹配错误。as f64将长度值转为浮点数,确保除法操作能正常执行。
注意:
as转换在数值类型间是截断式转换,不是四舍五入。比如3.14 as i32会得到3,这可能引发精度问题。
1.1 as的典型使用场景
-
数值类型转换:
rust复制let x = 42u32 as u64; // 小转大安全 let y = 3.14 as i32; // 浮点转整型会截断 -
指针类型转换:
rust复制let raw_ptr = &mut 5 as *mut i32; -
消除泛型歧义:
rust复制let value = "3".parse::<i32>().unwrap(); // 显式指定类型
实际项目中,我建议在以下情况优先使用as:
- 基础类型间的安全转换
- 需要明确表达转换意图的简单场景
- 性能敏感路径上的类型转换
2. 自定义类型转换:From和Into的实战应用
2.1 实现From trait的标准姿势
Rust的标准库提供了From和Into这对黄金搭档,让我们能为自定义类型定义转换规则。先看个完整示例:
rust复制#[derive(Debug)]
struct Person {
name: String,
age: u8,
}
impl Default for Person {
fn default() -> Self {
Self {
name: String::from("John"),
age: 30,
}
}
}
impl From<&str> for Person {
fn from(s: &str) -> Self {
let parts: Vec<&str> = s.split(',').collect();
if parts.len() != 2 {
return Person::default();
}
let name = parts[0];
if name.is_empty() {
return Person::default();
}
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容