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];
}