我还在试着用生锈把我的头绕在脑后,但我遇到了一个问题。我有一个结构,它有一个映射,我尝试在一个函数中添加到那个映射中。它将字符串id映射到对象:
pub struct AGVController<'a> {
agv_map: HashMap<&'a str, AGV>
}
impl AGVController<'_> {
// Create a new AGV Controller
pub fn new() -> Self {
Self {
agv_map: HashMap::new()
}
}
// Add a new AGV
pub fn add_agv(&mut self, ip_addr: &str) -> Option<&str> {
let new_agv = AGV::new(ip_addr);
match self.agv_map.get(ip_addr) {
Some(_) => {
let result = format!("AGV with ip address {} already exists", ip_addr);
return Some(result.as_str());
},
None => {
self.agv_map.insert(ip_addr, new_agv);
}
}
return Some("");
}
}在add中,我希望创建一个新实例并将其添加到映射中。I‘我得到了以下错误:
lifetime of reference outlives lifetime of borrowed content...
--> src/agv/agv_controller.rs:58:37
|
58 | self.agv_map.insert(ip_addr, new_agv);
| ^^^^^^^
|
note: ...the reference is valid for the lifetime `'_` as defined here...
--> src/agv/agv_controller.rs:16:20
|
16 | impl AGVController<'_> {
| ^^
note: ...but the borrowed content is only valid for the anonymous lifetime defined here
--> src/agv/agv_controller.rs:50:40
|
50 | pub fn add_agv(&mut self, ip_addr: &str) -> Option<&str> {
| ^^^^它似乎是说,在地图中的引用将超过引用传递的参数,这是公平的,我想。有人能向我解释一下,我是如何在函数中将键传递给函数中的映射添加条目的吗?
发布于 2022-04-12 18:08:47
这将失败,因为ip_addr引用的生存期仅在add_agv方法执行时有效,但对于AGVController<'a>中的'a,它必须是有效的。要解决此问题,请将'a生存期添加到impl块中,并将其用于此参数:
impl<'a> AGVController<'a> {
// ...
pub fn add_agv(&mut self, ip_addr: &'a str) -> Option<&str> {这就引出了第二个问题:尝试将一个&str返回给这个函数所拥有的String (在result中)。这根本不可能;相反,返回一个Option<String>,对return语句进行适当的更改。
pub fn add_agv(&mut self, ip_addr: &'a str) -> Option<String> {return Some(result);return Some("".to_owned());(游乐场)
或者,考虑返回一个Result,这是指示可能失败的操作的更好方法:
use std::error::Error;
use std::fmt::{Display, Formatter, Error as FmtError};
#[derive(Debug)]
pub struct DuplicateIPAddress(pub String);
impl Error for DuplicateIPAddress {}
impl Display for DuplicateIPAddress {
fn fmt(&self, w: &mut Formatter) -> Result<(), FmtError> {
write!(w, "Duplicate IP address {}", self.0)
}
}现在您的函数可以返回Result<(), DuplicateIPAddress>
pub fn add_agv(&mut self, ip_addr: &'a str) -> Result<(), DuplicateIPAddress> {return Err(DuplicateIPAddress(ip_addr.to_owned()));return Ok(());(游乐场)
https://stackoverflow.com/questions/71847206
复制相似问题