我有这些 struct :

#[derive(Debug, RustcDecodable)]
struct Config {
    ssl: Option<SslConfig>,
}

#[derive(Debug, RustcDecodable)]
struct SslConfig {
    key: Option<String>,
    cert: Option<String>,
}

他们从一个toml人的档案中被填满.这个很好用.因为我得了Option<T>分,所以我要么打unwrap(),要么打match.

但如果我想做以下事情:

let cfg: Config = read_config(); // Reads a File, parses it and returns the Config-Struct
let keypath = cfg.ssl.unwrap().key.unwrap();
let certpath = cfg.ssl.unwrap().cert.unwrap();

这行不通,因为cfg.ssl会被转移到keypath.但它为什么会被移动?我在ssl上打unwrap()来取 keys (然后unwrap()把 keys 给我).所以key.unwrap()的结果应该被移动?

还是我漏掉了一点?让这些 struct 像这样(或以其他简洁的方式)可访问的最佳方法是什么?我试图实现#[derive(Debug, RustcDecodable, Copy, Clone)],但这不起作用,因为我还必须实现CopyString.然后我必须实现CopyVec<u8>等等.一定有更方便的解决办法吗?

推荐答案

Option::unwrap的定义是什么?From the documentation:

fn unwrap(self) -> T

它消耗其输入(此处为cfg.ssl).

这不是你想要的,而是你想要从Option<T>&T,这将从消耗&self开始(通过引用,而不是值)...或者在拨打unwrap之前先拨打clone.

克隆很少是解决方案...这里的替代方案是as_ref:

fn as_ref(&self) -> Option<&T>

因此你可以写:

let keypath /*: &String*/ = cfg.ssl.as_ref().unwrap().key.as_ref().unwrap();
                                    ^~~~~~~               ^~~~~~~~

Rust相关问答推荐

如何在Rust中获得高效的浮点最大值

重新导出proc宏导致未解决的extern crate错误""

Rust中的相互递归特性与默认实现

文档示例需要导入相关的 struct ,但仅在运行测试时.这是故意的行为吗?

铁 rust 干线无法使用PowerShell获取环境变量

为什么BitVec缺少Serialize trait?

Rust类似功能是C++命名空间吗?

S,一般性状和联想型性状有什么不同?

使用Py03从Rust调用Python函数时的最佳返回类型

在复制类型中使用std::ptr::WRITE_VILAR进行内部可变性的安全性(即没有UnSafeCell)

在Rust内联程序集中使用字符串常量

Rust proc_macro 和 syn:解析空格

为什么将易错函数的泛型结果作为泛型参数传递 infer ()?不应该是暧昧的吗?

是否可以在不直接重复的情况下为许多特定类型实现一个函数?

我们可以在 Rust 切片中使用步骤吗?

在没有任何同步的情况下以非原子方式更新由宽松原子操作 Select 的值是否安全?

是否可以通过可变引用推进可变切片?

如何递归传递闭包作为参数?

从 Axum IntoResponse 获取请求标头

如何构建包含本地依赖项的 docker 镜像?