Rust|60个新手常犯的错误

本文列举了Rust初学者在编程过程中常见的60个错误,包括错误地使用可变和不可变借用、忘记处理Option、不匹配的类型、未导入trait、在遍历向量时尝试修改它等问题,并提供了相应的解决方案,帮助开发者更好地理解和避免这些错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.错误地使用可变和不可变借用

let mut data = vec![1, 2, 3];
let x = &data[0];
data.push(4);
println!("{}", x);

不能在有不可变引用时修改数据。

2.忘记处理 Option

fn main() {
    let some_number = Some(5);
    let sum = some_number + 5; // 错误:Option 类型不能这样直接使用
}

使用 match 或 if let 来处理 Option。

let sum = if let Some(n) = some_number { n + 5 } else { 0 };

3.期望的引用而不是实际值

fn foo(x: &i32) {
    // ...
}

fn main() {
    let x = 10;
    foo(x); // 错误:应传递引用而不是值
}

传递引用而不是值。

foo(&x);

4.不匹配的类型

fn main() {
    let flag = true;
    let number = if flag { 5 } else { "six" }; // 错误:不匹配的类型
}

解决方案:确保所有的分支返回相同的类型。

let number = if flag { 5 } else { 6 };

5.忘记导入trait

use std::io::Write; // 因为 Write trait 已导入

fn main() {
    let mut buffer = Vec::new();
    buffer.write_all(b"hello").unwrap();
    // 现在可以正常使用 write_all 方法,因为 Write trait 已导入
}

必须导入Write trait才能使用其方法。

6.试图在遍历向量的同时修改它

fn main() {
    let mut vec = vec![1, 2, 3];
    for val in &vec {
        vec.push(*val + 10); // 错误!不能在遍历时修改vec
    }
}

修复: 使用迭代器的.for_each()方法或者先收集需要做的更改,然后再应用它们。

7.不使用可变引用来修改向量中的值

fn main() {
    let mut vec = vec![1, 2, 3];
    for val in vec.iter() {
        *val *= 2; // 错误!因为`val`是不可变引用
    }
}

修复: 使用.iter_mut()来获取可变引用。

for val in vec.iter_mut() {
    *val *= 2;
}

8.在向量迭代时错误地使用索引

fn main() {
    let vec = vec![10, 20, 30];
    for i in 0..vec.len() {
        println!("{}", vec[i]); // 索引方式正确
        // 如果修改为 vec[i+1] 就会出错
    }
}

修复: 确保在使用索引时不要越界。

9.未处理get()返回Option的情况

fn main() {
    let vec = vec![1, 2, 3];
    let val = vec.get(5); // 返回None,因为索引超出范围
    println!("{}", val.unwrap()); // 错误!这会panic
}

修复: 使用.unwrap_or()或.unwrap_or_else()处理None情况。

let val = vec.get(5).unwrap_or(&0); // 使用默认值
println!("{}", val);

10.使用不恰当的迭代器消费方法

fn main() {
    let vec = vec![1, 2, 3, 4, 5];
    let even_numbers: Vec<_> = vec.iter().map(|x| x * 2).collect(); // 正确
    let even_number = even_numbers.first().unwrap(); // 尝试获取第一个数
    println!("{}", even_number * 2); // 错误!even_number的类型是&&i32
}

修复: 在使用值之前进行适当的解引用。

println!("{}", (**even_number) * 2); // 解引用两次到i32

11.在遍历过程中错误地使用for循环去显式创建迭代器

fn main() {
    let vec = vec![1, 2, 3];
    for i in 0..vec.iter().count() { // 错误!不必要的计数和索引
        println!("{}", vec[i]);
    }
}

修复: 直接遍历迭代器。

for &val in vec.iter() {
&n
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hann Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值