如何将tokio中Command::arg()的结果赋值给结构体字段?
问题分析
你的代码报错是因为new函数中创建的tokio::process::Command是局部变量,函数执行结束后这个变量会被销毁。但你试图让结构体Manager持有该变量的可变引用,这会导致悬垂引用——引用指向了已经不存在的内存,Rust的所有权规则会直接阻止这种不安全的行为。
解决方案
根据你的需求,有两种合理的处理方式:
1. 让结构体直接拥有Command的所有权
这是最常见的场景,让Manager管理Command的生命周期,无需引用:
pub struct Manager { pub cmd: tokio::process::Command } impl Manager { pub fn new() -> Manager { // 注意ls的参数应该是"-la"而非"la" Manager { cmd: tokio::process::Command::new("ls").arg("-la") } } }
这种写法下,Command的所有权完全属于Manager,不存在引用生命周期的问题,符合Rust的安全规则。
2. 结构体持有外部Command的可变引用
如果Command需要由外部创建并传递进来,那么new函数需要接收一个可变引用作为参数,让引用的生命周期由外部变量决定:
pub struct Manager<'a> { pub cmd: &'a mut tokio::process::Command } impl<'a> Manager<'a> { pub fn new(cmd: &'a mut tokio::process::Command) -> Manager<'a> { cmd.arg("-la"); Manager { cmd } } } // 使用示例 fn main() { let mut cmd = tokio::process::Command::new("ls"); let manager = Manager::new(&mut cmd); }
这里引用的生命周期'a和外部cmd的生命周期绑定,确保manager存在期间,cmd不会被销毁。
内容的提问来源于stack exchange,提问作者Christopher Wilke
相关产品推荐
相关产品推荐

