我正在尝试使用quick-xml
来封装一个XML解析器,输入的是一些特定的XML内容。主要代码如下:
pub struct GPXParser<B: BufRead> {
reader: Reader<B>,
buff: Vec<u8>,
}
impl<B> GPXParser<B> {
pub fn read_next<a>(&mut self) -> Result<XMLCache, Error> {
match self.reader.read_event(&mut self.buff) {
Ok(XMLEvent::Start(ref e)) if e.name() == b"wpt" => {
self.read_next_wpt() // --> Multiple mutable borrows error
}
_ => Err(Error::NoCaches),
}
}
fn read_next_wpt(&mut self) -> Result<XMLCache, Error> {
match self.reader.read_event(&mut self.buff) {
_ => Err(Error::NoCaches),
}
}
}
我读了这个关于rust-lang.org的主题,其中提到:
习惯用法的rust代码通常避免持有长期的对可变对象内部的引用,并支持使用不可变引用或独立值的替代方法。
我尝试改变我的方法,使用一个中间的buff
元素:
pub struct GPXParser<B: BufRead> {
reader: Reader<B>,
}
impl<B> GPXParser<B> {
pub fn read_next<a>(&mut self) -> Result<XMLCache, Error> {
let mut buff: Vec<u8> = Vec::new();
match self.reader.read_event(&mut buff) {
Ok(XMLEvent::Start(ref e)) if e.name() == b"wpt" => {
self.read_next_wpt(&mut buff) // --> Multiple mutable borrows error
}
_ => Err(Error::NoCaches),
}
}
fn read_next_wpt(&mut self, buff: &mut Vec<u8>) -> Result<XMLCache, Error> {
match self.reader.read_event(buff) {
_ => Err(Error::NoCaches),
}
}
}
我没有改变方法。
我尝试将match
语句分成两行:
pub fn read_next<a>(&mut self) -> Result<XMLCache, Error> {
let result = self.reader.read_event(&mut self.buff);
match result {
Ok(XMLEvent::Start(ref e)) if e.name() == b"wpt" => self.read_next_wpt(),
_ => Err(Error::NoCaches),
}
}
但是我得到了同样的错误:
error[E0499]: cannot borrow `*self` as mutable more than once at a time
--> src/gpx/mod.rs:34:17
|
31 | let result = self.reader.read_event(&mut self.buff);
| --------- first mutable borrow occurs here
...
34 | self.read_next_wpt()
| ^^^^ second mutable borrow occurs here
...
39 | }
| - first borrow ends here
有没有一种方法可以在不同的方法调用中使用相同的缓冲区?
是否需要引入某些生命周期?
如果不需要,那么解决这个问题的惯用Rust方法是什么?
XMLEvent::Start(ref e)
?而不是XMLEvent::Start(e)
? - Boiethiosref
,它还能编译吗?如果可以,我会写一个答案。 - Boiethios