gpt4 book ai didi

rust - 有条件地创建向量时如何正确满足借用检查器

转载 作者:行者123 更新时间:2023-12-03 11:43:14 27 4
gpt4 key购买 nike

所以,我想创建一个不可变的向量(因为在编译时长度是未知的)(因为当我创建它时我会最后一次修改它)。基本上,我要么从文件中获取值,要么从命令行参数中获取值,然后稍后迭代这些值。

我想做

/* other file
pub struct Settings {
pub repo_name: String,
}
pub fn get_settings() -> Result<Settings, ConfigError>
*/

let settings = get_settings();
let args = App.blah.get_matches(); //clap::ArgMatches
let repos: Vec<_>;
if args.is_present("repo") {
repos = args.values_of("repo").unwrap().collect(); // https://docs.rs/clap/2.31.1/clap/struct.ArgMatches.html#method.values_of
} else {
// I want repos to own the value I clone here
repos = vec![settings.repo_name.clone()];
}

为此,vec!想要一个引用。如果我使用带有 clone() 的引用,则引用生命周期在分配之前结束。
如果我创建了一个新变量,则生命周期在 block 的末尾结束。
如果我直接从设置中借用,我以后就屏蔽了其他用途。

最后,我使它与
let default_repo = settings.repo_name.clone();
if args.is_present("repo") {
repos = args.values_of("repo").unwrap().collect();
} else {
repos = vec![&default_repo];
}

但我想知道是否有一种方法可以真正给 repos新向量中值的所有权?

最佳答案

我认为您必须决定 repos 的类型.

  • repos = args.values_of("repo").unwrap().collect()创建一个 Vec<&str> ,即切片向量
  • repos = vec![settings.repo_name.clone()];创建一个 Vec<String>

  • 如果您决定选择 Vec<&str> (减少复制,但您必须更关心生命周期),您可以将第二个更改为 repos = vec![&settings.repo_name] .为此, settings必须活得够久。

    如果您决定选择 Vec<String> ,您可以将第一个更改为 repos = args.values_of("repo").unwrap().map(|s|s.to_string()).collect() .

    另一个选项如下:完全省略向量,而是引入另一个带迭代器的函数,并简单地使用 values_of("repo").unwrap() 调用此函数。或与 std::iter::once(repo_name) .

    关于rust - 有条件地创建向量时如何正确满足借用检查器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61528889/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com