Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 在有条件地创建向量时,如何正确满足借用检查器的要求_Rust - Fatal编程技术网

Rust 在有条件地创建向量时,如何正确满足借用检查器的要求

Rust 在有条件地创建向量时,如何正确满足借用检查器的要求,rust,Rust,因此,我想创建一个不可变的向量(因为在编译时长度是未知的)(因为当我创建它时,是最后一次修改它)。基本上,我要么从文件中获取值,要么从命令行参数中获取值,然后在以后迭代这些值 我想做 /* other file pub struct Settings { pub repo_name: String, } pub fn get_settings() -> Result<Settings, ConfigError> */ let settings = get_settings

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

我想做

/* 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()];
}

但我想知道是否有一种方法可以真正赋予
回购
新向量中价值的所有权?

我认为你必须决定
回购
的类型

  • repos=args.values\u of(“repo”).unwrap().collect()
    创建一个
    Vec
    ,即切片向量
  • repos=vec![settings.repo_name.clone()]创建一个
    Vec
如果您决定使用
Vec
(减少复制,但您必须更加关注生命周期),您可以将第二个更改为
repos=Vec![&settings.repo\u name]
。要使其工作,
设置
必须足够长

如果决定使用
Vec
,可以将第一个更改为
repos=args.values\u of(“repo”).unwrap().map(|s|s.to_string()).collect()


另一种选择是:完全忽略向量,而是引入另一个使用迭代器的函数,只需使用
value\u of(“repo”).unwrap()
std::iter::once(repo\u name)

调用此函数,我想您必须决定
repos
的类型

  • repos=args.values\u of(“repo”).unwrap().collect()
    创建一个
    Vec
    ,即切片向量
  • repos=vec![settings.repo_name.clone()]创建一个
    Vec
如果您决定使用
Vec
(减少复制,但您必须更加关注生命周期),您可以将第二个更改为
repos=Vec![&settings.repo\u name]
。要使其工作,
设置
必须足够长

如果决定使用
Vec
,可以将第一个更改为
repos=args.values\u of(“repo”).unwrap().map(|s|s.to_string()).collect()


另一个选项是:完全省略向量,而是引入另一个使用迭代器的函数,只需使用(“repo”).unwrap()的
values\u或
std::iter::once(repo\u name)调用此函数即可

很难回答这个问题,因为代码中包含许多未定义的名称。例如,如果不知道
args
是什么类型,我们就无法判断
Vec
应该包含什么类型。请确保问题包含。很难回答此问题,因为代码包含许多未定义的名称。例如,如果不知道
args
是什么类型,我们就无法判断
Vec
应该包含什么类型。请在问题中包含一个。假设您对问题的性质是正确的,您还可以通过将项目分别包装在
Cow::Borrowed
Cow::Owned
中来创建
Vec
。设置与以后的回购同时使用,因此它会抱怨借用冲突,这是公平的。在使用设置时,我使用了所有克隆,但即使如此,我认为如果我们借用回购协议,它也会被阻止,因为它在我通过回购协议的循环中。我将使用迭代器探索函数,我认为这听起来是一个不错的选择。将事物推入函数以隔离借用是一种特定的惯用生锈事物吗?您可以尝试将
设置
回购
分开(即创建一个结构
所有设置
,其中包含两个字段:
设置
(包含不包含回购的设置)和
回购
(包含回购))。这将导致借贷不重叠。假设您对问题的本质是正确的,您还可以通过将项目分别包装在
Cow::Borrowed
Cow::Owned
中来创建
Vec
。设置与以后的回购同时使用,因此它会抱怨借贷冲突,这是公平的。在使用设置时,我使用了所有克隆,但即使如此,我认为如果我们借用回购协议,它也会被阻止,因为它在我通过回购协议的循环中。我将使用迭代器探索函数,我认为这听起来是一个不错的选择。将事物推入函数以隔离借用是一种特定的惯用生锈事物吗?您可以尝试将
设置
回购
分开(即创建一个结构
所有设置
,其中包含两个字段:
设置
(包含不包含回购的设置)和
回购
(包含回购))。这将导致借款不重叠。
let default_repo = settings.repo_name.clone();
if args.is_present("repo") {
    repos = args.values_of("repo").unwrap().collect();
} else {
    repos = vec![&default_repo];
}