Rust Vec的当前函数错误所拥有的引用数据
我正在编写代码来解析CLI参数,遇到了一个非常常见的错误 我需要做什么更改(理想情况下不需要将所有内容分配给单个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切片{
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
。我正在更新我的代码,并能够在这个过程中删除许多生存期参数。一旦我编译完所有内容,将标记为答案。