首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入函数中的映射

插入函数中的映射
EN

Stack Overflow用户
提问于 2022-04-12 17:56:23
回答 1查看 69关注 0票数 0

我还在试着用生锈把我的头绕在脑后,但我遇到了一个问题。我有一个结构,它有一个映射,我尝试在一个函数中添加到那个映射中。它将字符串id映射到对象:

代码语言:javascript
复制
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‘我得到了以下错误:

代码语言:javascript
复制
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> {
   |                                        ^^^^

它似乎是说,在地图中的引用将超过引用传递的参数,这是公平的,我想。有人能向我解释一下,我是如何在函数中将键传递给函数中的映射添加条目的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-12 18:08:47

这将失败,因为ip_addr引用的生存期仅在add_agv方法执行时有效,但对于AGVController<'a>中的'a,它必须是有效的。要解决此问题,请将'a生存期添加到impl块中,并将其用于此参数:

代码语言:javascript
复制
impl<'a> AGVController<'a> {
    // ...

    pub fn add_agv(&mut self, ip_addr: &'a str) -> Option<&str> {

这就引出了第二个问题:尝试将一个&str返回给这个函数所拥有的String (在result中)。这根本不可能;相反,返回一个Option<String>,对return语句进行适当的更改。

代码语言:javascript
复制
pub fn add_agv(&mut self, ip_addr: &'a str) -> Option<String> {
代码语言:javascript
复制
return Some(result);
代码语言:javascript
复制
return Some("".to_owned());

(游乐场)

或者,考虑返回一个Result,这是指示可能失败的操作的更好方法:

代码语言:javascript
复制
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>

代码语言:javascript
复制
pub fn add_agv(&mut self, ip_addr: &'a str) -> Result<(), DuplicateIPAddress> {
代码语言:javascript
复制
return Err(DuplicateIPAddress(ip_addr.to_owned()));
代码语言:javascript
复制
return Ok(());

(游乐场)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71847206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档