我的代码在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,我可能太多地用典型的面向对象的方式来处理事情,不得不尝试重新思考我的方法。
1条答案
按热度按时间x6h2sr281#
在我看来,问题在于
Calendar
结构体并不拥有输入字符串的所有权,它只保留引用。我对
icalendar
库不是很熟悉,但看起来有两个不同的Calendar
结构体:icalendar::parser::Calendar和icalendar::Calendar。我在我的机器上做了一些调整,删除了webdav的东西,这样它就可以编译了,但似乎使用
icalendar::Calendar
变体会编译:这个版本的结构体看起来很相似,但是拥有了它的组成部分,而不是借用它们。就像我说的,我不熟悉这个图书馆,所以我可能会说废话。