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 Vec的当前函数错误所拥有的引用数据_Rust - Fatal编程技术网

Rust Vec的当前函数错误所拥有的引用数据

Rust Vec的当前函数错误所拥有的引用数据,rust,Rust,我正在编写代码来解析CLI参数,遇到了一个非常常见的错误 我需要做什么更改(理想情况下不需要将所有内容分配给单个let变量)来修复编译错误 我一直在看很多类似的帖子,也在重读铁锈书中关于所有权的章节。但是我还没有找到解决我具体情况的方法 我解析args的代码如下: : pub fn new, 预设:Vec,字符串>{ 设args2=args; 让args_vec=args2.collect::(); 设args_slice=args_vec.as_slice(); 让结果=匹配args\u切片{

我正在编写代码来解析CLI参数,遇到了一个非常常见的错误

我需要做什么更改(理想情况下不需要将所有内容分配给单个
let
变量)来修复编译错误

我一直在看很多类似的帖子,也在重读铁锈书中关于所有权的章节。但是我还没有找到解决我具体情况的方法

我解析
args
的代码如下:

:

pub fn new,
预设:Vec,字符串>{
设args2=args;
让args_vec=args2.collect::();
设args_slice=args_vec.as_slice();
让结果=匹配args\u切片{
[\ux,预设]=>{
如果预设==“帮助”{
错误(格式(
“试试看,高尔
try:gol{:?}
try:gol[width height num_start_cells seed display_dead display_alive](例如:gol 40 4045)”,
预设
))
}如果预设包含(&&preset[…]),则为else{
Ok(配置::预设{
键:预设。到_字符串(),
})
}否则{
错误(格式!(“未知预设,从{:?}中选择,预设))
}
}
[\u]=>正常(默认世界定义),
[uuw,h,n,s]=>{
let(宽度、高度、起始单元格数、种子)=配置::解析参数(&w、&h、&n、&s)?;
Ok(配置::WorldDef{
宽度,
高度,
num_启动_单元格,
种子,
死人:没有,
活着的夏尔:没有,
})
}
[uuw,h,n,s,d,a]=>{
let(宽度、高度、起始单元格数、种子)=配置::解析参数(&w、&h、&n、&s)?;
Ok(配置::WorldDef{
宽度,
高度,
num_启动_单元格,
种子,
死字符:一些(&d),
活字符:一些(&a),
})
}
args=>Err(格式(
“预期至少有4或6个参数,但得到{}”,
args.len()-1
))
};
结果
这将导致以下错误:

错误[E0515]:无法返回引用局部变量'args\u vec'的值`
-->src/config.rs:77:9
|
27 |设args_slice=args_vec.as_slice();
|------------“args_vec”在这里借用
...
77 |结果
|^^^^返回一个值,该值引用当前函数拥有的数据
我试过:

  • 修改生存期参数(使更多内容
    静态
  • 将每个方法调用的结果分配给一个变量(请参见上面的
    args2
    args\u vec
    args\u slice
  • 将参数
    args:env::args
    作为
    new
    函数的参考(
    &

据我所知,问题是
result
引用了一个/所有的args变量,这些变量超出了范围,并在
新的
方法的末尾被删除,而
result
将来依赖于
新的
方法。

匹配时
给出
确定(配置::worldef{…dead\u char Some(&d),alive\u char Some(&a)}
最后两个引用是
String
s中的片段,属于
args\u vec
(通过
args\u slice
访问)

当函数退出时,
args\u vec
不再存在,因此如果Rust没有抱怨,结果中的引用将悬空

我建议您将
String
s而不是
&str
存储在
dead\u char
alive\u char
成员中;这样,结果可以将这些字符串的所有权从
args\u vec
转移到字符串中。
顺便说一句,如果你这样做,我不确定
args\u slice
是否有用;我认为你可以在
match
语句中使用
args\u vec
,因为它以后不会被使用。

可以!我还将发布一个github链接到完整文件。谢谢。这很有意义。我没有考虑过如何访问数据库中的数据
match
。我正在更新我的代码,并能够在这个过程中删除许多生存期参数。一旦我编译完所有内容,将标记为答案。