无法理解生锈生命周期冲突



我在做一个虚拟的应用程序来掌握Rust的概念。在做XML结构时,我得到了错误

中的生命周期参数

不能推断出适当的生命周期由于需求冲突导致的函数调用

定义

impl<'a> XmlFile<'a>

pub fn get_node<'b>(self, node: &'b [u8]) -> &'b [u8] 

据我所知,Rust编译器不喜欢返回变量可以在函数结束后删除,如果XML文件在不同的时间删除(因为它们有'a'b生命期)。但是如果我输入相同的,我得到错误

生命周期'a已经在作用域中

,所以我找不到解决这个错误的方法。

你知道我错过了什么吗?我想我一定还是缺少一些Rust的概念。

编辑:我错误地添加了导致问题的代码

#[allow(unused_parens)] 
pub struct  XmlFile<'a> {
last_open_node: &'a[u8],
last_published: String,
index_pos: u64,
content: &'a[u8],
}
impl<'a> XmlFile<'a> {
pub fn new<'b: 'a>(file: &'b [u8]) -> XmlFile<'b> {
let new_xml = XmlFile {
last_open_node: &[0: u8],
last_published: "".to_string(),
index_pos: 0,
content: file,
};
return new_xml;
}
pub fn get_node<'b: 'a>(&self, node: &'b [u8]) -> &'b [u8] {
let buf_index: u64 = 0;
let has_matched: bool = false;
self.index_pos = 0;
for c in self.content {
self.index_pos += 1;
if (c == &b'<') {
buf_index = self.index_pos;
while (c != &b' ') {
for b in node {
if b == &self.content[buf_index as usize] {
has_matched = true;
buf_index += 1
} else {
has_matched = false;
continue;
}
}
if has_matched {
while(self.content[buf_index as usize] != b'>'){
buf_index+=1;
}
let r  =  &self.content[self.index_pos as usize..buf_index as usize];
return r;
}
}
}
}
return &[0 : u8];
}
pub fn get_rss_version<'b:'a>(&self) -> Result<u64 , &'static str>{
let found_slice = Self::get_node(&self, "rss".as_bytes());
if(found_slice != &[0:u8]){
let version_value = Self::get_value(found_slice);
if(version_value.is_ok()){
return Ok(version_value.unwrap()) ;
}
else{
return Err("Couldn't retrieve version from tag");
}
}
else{
println!("Couldn't find tag <rss");
return Err("Couldn't find tag <rss");
}
}
}

让我们看看您的get_node签名:

pub fn get_node<'b: 'a>(&mut self, node: &'b [u8]) -> &'b [u8] { ... }

和你在这个方法中实际返回的内容:

let r = &self.content[self.index_pos as usize..buf_index as usize];
return r;

get_node的签名表明此方法将返回node的子片,但实际上您返回的是XmlFilecontent的子片。

这个问题的一个解决方案是理解返回值不是node的一部分,而是self.content的一部分。因此,我们可以将签名更改为:

pub fn get_node<'b>(&mut self, node: &'b [u8]) -> &'a [u8] { ... }

在这种情况下,我们甚至可以完全省略生命周期的手工规范:

pub fn get_node(&mut self, node: &[u8]) -> &[u8] { ... }

这是get_node方法的一个清理版本,它实际编译:

pub fn get_node(&mut self, node: &[u8]) -> &[u8] {
let mut buf_index: u64;
let mut has_matched: bool = false;
self.index_pos = 0;
for c in self.content {
self.index_pos += 1;
if c == &b'<' {
buf_index = self.index_pos;
while c != &b' ' {
for b in node {
if b == &self.content[buf_index as usize] {
has_matched = true;
buf_index += 1
} else {
has_matched = false;
continue;
}
}
if has_matched {
while self.content[buf_index as usize] != b'>' {
buf_index += 1;
}
let r = &self.content[self.index_pos as usize..buf_index as usize];
return r;
}
}
}
}
return &[0u8];
}

最新更新