rust 返回一个结构体,该结构体引用了一个将被删除的值

pbpqsu0x  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(146)

我的代码在rust中有问题。它不得不与借款有关。这是我第一次尝试自己的代码后阅读rust书。
问题是,我有点理解问题是什么,并有一个想法如何解决它,但解决方案将结束一些丑陋的结构化代码。
我有一个struct,它实现了以下方法:

pub(crate) fn get_calendar_events(&self, name: &str) -> Result<Vec<Calendar>,String> {
    let xml: String = self.get_calendar_xml(name).map_err(|e|{
        format!("Error extracting xml: {}", e)
    })?;

    let event_responses: Vec<Responses> = self.parse_event_responses(&xml);

    let mut events: Vec<Calendar> = Vec::new();

    for response in event_responses {
        let ics_result: Result<Response,Error> = self.webdav_client.get(&format!("{}/{}", self.url, response.href));
        let ics_response: Response = ics_result.map_err(|e|{
            format!("Error in ics result: {}", e)
        })?;
        let mut ics: String = ics_response.text().map_err(|e|{
            format!("Error in ics response: {}", e)
        })?;

        let calendar_result: Result<Calendar<'_>, String> = read_calendar(&ics);

        let calendar_event: Calendar = calendar_result.map_err(|e|{
            format!("Error reading calendar event: {}", e)
        })?;
        events.push(calendar_event);
    }
    Ok(events)
}

在循环中,我有变量ics。方法read_calendar来自于crate“iCalendar”,并接受&str作为参数。我想从read-calendar解压缩结果,并将calendar_event推送到一个Vec中,我想让方法返回。
我得到了一个错误,即ics将在循环结束时被丢弃,而calendar_result(和calendar_event)在被丢弃时不能引用该值。
解决这个错误的唯一方法是将完整的循环外包到需要访问calendar_event的地方,但这将以一些混乱的代码结束。
来自java,我可能太多地用典型的面向对象的方式来处理事情,不得不尝试重新思考我的方法。

x6h2sr28

x6h2sr281#

在我看来,问题在于Calendar结构体并不拥有输入字符串的所有权,它只保留引用。
我对icalendar库不是很熟悉,但看起来有两个不同的Calendar结构体:icalendar::parser::Calendar和icalendar::Calendar。
我在我的机器上做了一些调整,删除了webdav的东西,这样它就可以编译了,但似乎使用icalendar::Calendar变体会编译:

use icalendar::{parser::read_calendar, Calendar as CalendarOwned};

pub fn get_calendar_events(name: &str) -> Result<Vec<CalendarOwned>, String> {
    let mut events: Vec<CalendarOwned> = Vec::new();

    loop {
        let mut ics: String = "thing".to_owned();

        let calendar_result = read_calendar(&ics);

        let calendar_event = calendar_result
            .map_err(|e| format!("Error reading calendar event: {}", e))
            .unwrap();

        events.push(calendar_event.into());

        break;
    }

    Ok(events)
}

这个版本的结构体看起来很相似,但是拥有了它的组成部分,而不是借用它们。就像我说的,我不熟悉这个图书馆,所以我可能会说废话。

相关问题