Parsing 由于需求冲突,无法推断自动引用的适当生存期

Parsing 由于需求冲突,无法推断自动引用的适当生存期,parsing,rust,lifetime,Parsing,Rust,Lifetime,我正在用Rust编写HTTP解析器。所有的输入都是ASCII码,所以我只使用和[u8]对字节进行迭代 #[derive(Debug)] pub enum ParseError { Method, OutOfBound, } struct Bytes<'src> { source: &'src [u8], i: usize, //current position in the source } impl<'src> Bytes&l

我正在用Rust编写HTTP解析器。所有的输入都是ASCII码,所以我只使用
和[u8]
对字节进行迭代

#[derive(Debug)]
pub enum ParseError {
    Method,
    OutOfBound,
}

struct Bytes<'src> {
    source: &'src [u8],
    i: usize, //current position in the source
}

impl<'src> Bytes<'src> {
    fn next(&mut self) -> Option<u8> {
        if self.source.len() > self.i + 1 {
            self.i += 1;
            Some(self.source[self.i - 1])
        } else {
            None
        }
    }

    fn until(&mut self, stop: u8) -> Result<&[u8], ParseError> {
        let start = self.i;
        while let Some(ch) = self.next() {
            if ch == stop {
                return Ok(&self.source[start..self.i - 1]);
            }
        }

        Err(ParseError::OutOfBound)
    }
}
#[派生(调试)]
发布枚举解析错误{
方法,,
离谱的,
}
结构字节{
fn下一步(&mut self)->选项{
如果self.source.len()>self.i+1{
自我评价i+=1;
一些(self.source[self.i-1])
}否则{
没有一个
}
}
fn直到(&mut self,stop:u8)->结果{
让我们开始=自我;
而让一些(ch)=self.next(){
如果ch==停止{
返回Ok(&self.source[start..self.i-1]);
}
}
错误(ParseError::OutofBond)
}
}
此功能:

use std::str;

fn uri<'str>(bytes: &mut Bytes<'str>) -> Result<&'str str, ParseError> {
    let until = try!(bytes.until(b' '));
    unsafe { Ok(str::from_utf8_unchecked(until)) }
}
使用std::str;
fn uri)->结果(字节:&mut字节{
37 | | let until=try!(bytes.until(b'');
38 | |不安全{正常(str::from_utf8_unchecked(直到))}
39 | | }
| |_^
注意:…这样引用就不会超过借用的内容
-->src/main.rs:37:22
|
37 | let until=try!(bytes.until(b'');
|                      ^^^^^
注意:但是,生存期必须对函数体上定义的36:1的生存期'str有效。。。
-->src/main.rs:36:1
|
36 |/fn uri)->结果,找到std::Result::Result)
-->src/main.rs:38:14
|
38 |不安全{Ok(str::from_utf8_unchecked(直到))}
|              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这很奇怪,因为'until'指的是一个函数参数,所以我认为这不应该是一个问题

更奇怪的是,当我直接索引字节时,它会编译

fn uri<'str>(bytes: &mut Bytes<'str>) -> Result<&'str str, ParseError> {
    unsafe { Ok(str::from_utf8_unchecked(&bytes.source[20..30])) }
}

fn uri)->ResultTL;DR linked duplicate:
fn-until(&mut-self,stop:u8)->结果
-->
fn-until-Result
,这是您想要的。以下是完整的源代码:。谢谢你的快速回复。重复的问题确实是这个问题。我问这个问题是因为我认为问题实际上在uri function.TL中;DR linked duplicate:
fn-until(&mut-self,stop:u8)->结果
-->
fn-until-Result
,这是您想要的。以下是完整的源代码:。谢谢你的快速回复。重复的问题确实是这个问题。我问这个问题是因为我认为问题实际上在uri函数中。