我有一个用于PostgreSQL的连接信息的 struct :

struct PgConf {
    host: String,
    port: i16,
    user: String,
    passwd: String,
    dbname: String
}

目前,我必须从HashMap字符串、字符串和gt;中初始化它:

impl PgConf {
    fn init(&mut self, args: &ArgList) -> () {
        if let Some(val) = args.get("host") {
            self.host = val.clone();
        }
        if let Some(val) = args.get("port") {
            self.port = val.parse().unwrap_or(5432);
        }
        if let Some(val) = args.get("user") {
            self.user = val.clone();
        }
        if let Some(val) = args.get("passwd") {
            self.passwd = val.clone();
        }
        if let Some(val) = args.get("db") {
            self.dbname = val.clone();
        }
    }
}

我认为上面的代码有点臃肿.有没有更好的方法来实现这一点?

推荐答案

更好的编写方法是创建一个返回Option<PgConf>的函数

fn try_create(args: HashMap<String,String>) -> Option<PgConfig>{
   let host = args.get("host")?;
   let user = args.get("user")?;
   let port = args.get("port")?.parse().unwrap_or(5432);
   let passwd = args.get("passwd")?;
   let dbname = args.get("db")?;
   Some(PgConfig{host,port,user,passwd,dbname})
}

如果散列映射中不存在所有字段,则?将返回None.当它们都存在时,将创建封装在Some中的不可变对象

或者类似的东西.

Rust相关问答推荐

如何定义使用拥有的字符串并返回拥有的Split的Rust函数?

通用池类型xsx

Rust:跨多个线程使用hashmap Arc和rwlock

这种获取-释放关系是如何运作的?

在Rust中判断编译时是否无法访问

链表堆栈溢出

是否提供Bundle 在可执行文件中的warp中的静态文件?

如何将 struct 数组放置在另一个 struct 的末尾而不进行内存分段

在 Rust 中,是否可以定义一个需要实现类型的构造函数的对象安全特征?

unwrap 选项类型出现错误:无法移出共享引用后面的*foo

Rust中如何实现一个与Sized相反的负特性(Unsized)

从Rust 的临时文件中创建引用是什么意思?

从 HashMap>, _> 中删除的生命周期问题

无法把握借来的价值不够长寿,请解释

RAII 模式的 Rust 解决方案,用于在 new() 和 drop() 上修改另一个对象

意外的正则表达式模式匹配

将文件的第一行分别读取到文件的其余部分的最有效方法是什么?

如何从 many0 传播 Nom 失败上下文?

如何创建动态创建值并向它们返回borrow 的工厂?

如何从 Rust 应用程序连接到 Docker 容器中的 SurrealDB?