rust中如何利用generic与PhantomData来实现更清晰的接口

本文介绍了如何在Rust中利用Generic和PhantomData改进密码管理器API的设计,以实现更清晰的状态管理和避免编译时错误。通过示例代码讨论了在状态切换和代码复用方面遇到的问题,并展示了如何使用PhantomData解决这些问题,强调了代码易用性和直觉性在编写高质量API中的重要性。

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

前两天看了一个在 rustlang 中如何利用 generic 和 PhantomData 来让我们的 api 更加合理的视频, 当时看完就想写一篇相关内容的文章, 但是没有立即动手,一推迟,不出意外的忘了。这两天又接手了一个半成品的项目, 需要维护原有代码和添加新的特性, 看代码的时候感慨良多, 又想起了前两天看的那个视频, 觉得必须得写点什么了。

假设我们要创建一个密码管理器, 这个管理器有两种状态, 一种是锁定状态, 在锁定状态下我们可以添加新的密码; 一种是非锁定状态, 在非锁定状态下我们可以列出所有的密码; 在任何状态下, 我们都可以查看管理器的版本。

代码如下:

use std::collections::HashMap;

#[derive(Debug, Eq, PartialEq)]
enum State {
   
    Locked,
    Unlocked,
}
struct PasswordManager {
   
    state: State,
    passwords: HashMap<String, String>,
    version: String,
}

impl PasswordManager {
   
    fn new(version: &str) -> Self {
   
        Self {
   
            state: State::Unlocked,
            passwords: HashMap::new(),
            version: version.into(),
        }
    }

    fn lock(&mut self) -> Result<(), String> {
   
        if self.state == State::Locked {
   
            return Err("cannot lock a locked manager".into());
        }
        self.state = State::Locked;
        Ok(())
    }

    fn unlock(&mut self) -> Result<(), String> {
   
        if self.state == State::Unlocked {
   
            return Err("cannot unlock a unlocked manager".into());
        }
        self.state = State::Unlocked;
        Ok(())
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值