不懂装懂的AI,折了程序员的阳寿

记录一次AI让我砸键盘的折寿行为。

最近在用 AI 来辅助学习 Rust 编程,想完成一个功能,读取 config.toml 配置文件,内容格式如下:

toml 复制代码
[dev]
username = "tester1"
password = "******"
[prod]
username = "tester2"
password = "******"

功能需要满足以下要求:

  • 如果能找到对应的配置,写入时直接更新
  • 如果找不到,则创建一个新的配置块,写入到文件最后
  • 新插入的配置块不能影响原有的配置顺序

实现了如下接口 write_target ,使用的是 toml 这个库,但是这个库做序列化写入的时候不能满足第三点需求(顺序是变的)

咨询AI,说是可以用 toml_edit 来实现这一要求,于是把上面的需求作为提示词给了 AI,让他用 toml_edit 帮我重新实现 write_target 这个函数。

经过几十轮的修改,最终还是没实现,代码都编译不过。(主要原因还是我菜,此处:狗头保命)

尝试过 Trae, Cursor,都没有一个能写出来通过编译的。(此处,跪求掘金大佬指点)

rust 复制代码
#[derive(Serialize, Deserialize, Debug, Default)]
struct Config {
    #[serde(flatten)]
    targets: std::collections::HashMap<String, Target>,
}

#[derive(Serialize, Deserialize, Debug, Clone)]
struct Target {
    username: String,
    password: String,
}

fn write_target(target: &String, username: &String, password: &String) {
    let mut config_path = home_dir().expect("无法访问Home目录");
    config_path.push(".config/yt/config.toml");
    let mut config: Config;
    if config_path.exists() {
        let content = fs::read_to_string(&config_path).unwrap();
        config = toml::from_str(&content).unwrap();
    } else {
        println!("配置文件不存在");
        fs::create_dir_all(config_path.parent().unwrap()).unwrap();
        config = Config::default();
    }

    let item = config.targets.get_mut(target);
    match item {
        Some(target) => {
            target.username = username.clone();
            target.password = password.clone();
        }
        None => {
            config.targets.insert(target.clone(), Target { username: username.clone(), password: password.clone() });
        }
    }

    match fs::write(config_path, toml::to_string(&config).unwrap()) {
        Ok(_) => {
            println!("写入配置文件成功");
        }
        Err(e) => {
            eprintln!("写入配置文件失败: {}", e);
        }
    }
}

后面翻 toml_edit 的文档:crates.io/crates/toml..., 看到示例中使用了 DocumentMut,于是亲自动手来修改 write_taget方法,居然成功了。

简化后的代码:

rust 复制代码
fn write_target(target: &String, username: &String, password: &String) {
    let mut config_path = home_dir().expect("无法访问Home目录");
    config_path.push(".config/yt/config.toml");

    let content = if config_path.exists() {
        fs::read_to_string(&config_path).unwrap()
    } else {
        String::new()
    };

    let mut doc = content.parse::<DocumentMut>().unwrap();
    let mut new_table = Table::new();
    new_table.insert("username", Item::Value(Value::from(username)));
    new_table.insert("password", Item::Value(Value::from(password)));
    doc[target] = Item::Table(new_table);

    fs::write(config_path, doc.to_string()).unwrap();
    println!("写入配置文件成功");
}
相关推荐
Rust语言中文社区2 小时前
【Rust日报】Dioxus 用起来有趣吗?
开发语言·后端·rust
小灰灰搞电子2 小时前
Rust Slint实现颜色选择器源码分享
开发语言·后端·rust
Source.Liu4 小时前
【Chrono库】Unix-like 系统时区处理实现(src/offset/local/unix.rs)
rust·time
I***26157 小时前
数据库操作与数据管理——Rust 与 SQLite 的集成
数据库·rust·sqlite
元Y亨H10 小时前
RustDesk 自建远程桌面服务器部署指南
rust
@大迁世界1 天前
相信我兄弟:Cloudflare Rust 的 .unwrap() 方法在 330 多个数据中心引发了恐慌
开发语言·后端·rust
2***B4491 天前
Rust在系统编程中的内存安全
开发语言·后端·rust
U***e631 天前
Rust错误处理最佳实践
开发语言·后端·rust
疏狂难除1 天前
随便玩玩lldb (二)
开发语言·后端·rust
Rust语言中文社区1 天前
【Rust日报】 丰田“先锋”选择了 Rust
开发语言·后端·rust