在Rust中返回可变Map引用



我的目标是以编程的方式向Cargo.toml添加一些开发依赖项。

我正在使用toml板条箱(toml = { version = "0.5.8", features = ["preserve_order"] })。

这是代码的一部分,我试图得到开发依赖关系的地图或创建一个新的地图时,开发深度没有定义。

let mut dev_deps = cargo_toml_content
.get_mut("dev-dependencies")
.and_then(Value::as_table_mut)
.unwrap_or_else(|| ???);

代码的Value::as_table_mut部分返回Option<&mut Table>,其中TableMap<String, Value>。如果函数不返回任何东西,我想在unwrap_or_else块中初始化一个新的Map并返回它。

我能够返回一个新的地图/表,但我不知道如何返回地图的可变引用。当我使用这样的东西时,我正在努力解决returns a reference to data owned by the current function这样的所有权问题:

...
.unwrap_or_else(|| {
let mut table = Table::default();
&mut table
});

那么我应该做什么(以及如何)来正确返回Table的可变引用?或者有没有更好的办法来解决这个问题?

可以在回调之外创建映射:

let mut empty = Table::default();
let mut dev_deps = cargo_toml_content
.get_mut("dev-dependencies")
.and_then(Value::as_table_mut)
.unwrap_or(&mut empty);

但最好还是只写match

如果你想在最后重新插入映射,最好从一开始就插入。