Rust 分配的匿名vs结构生存期
对于这段代码(删减了一些,抱歉没有更多),我遇到了一个终生的问题:Rust 分配的匿名vs结构生存期,rust,Rust,对于这段代码(删减了一些,抱歉没有更多),我遇到了一个终生的问题: fn main() { println!("Hello, world!"); } #[derive(Debug)] pub struct Token<'a> { pub line: usize, // Col in code points. pub col: usize, // Index in bytes. pub index: usize, pub sta
fn main() {
println!("Hello, world!");
}
#[derive(Debug)]
pub struct Token<'a> {
pub line: usize,
// Col in code points.
pub col: usize,
// Index in bytes.
pub index: usize,
pub state: TokenState,
pub text: &'a str,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum TokenState {
VSpace,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum ParseState {
Expr,
}
pub struct Node<'a> {
kids: Vec<Node<'a>>,
state: ParseState,
token: Option<&'a Token<'a>>,
}
impl<'a> Node<'a> {
fn new(state: ParseState) -> Node<'a> {
Node {
kids: vec![],
state,
token: None,
}
}
fn new_token(token: &'a Token<'a>) -> Node<'a> {
// TODO Control state? Some token state?
Node {
kids: vec![],
state: ParseState::Expr,
token: Some(&token),
}
}
fn push_if(&mut self, node: Node<'a>) {
if !node.kids.is_empty() {
self.kids.push(node);
}
}
}
pub fn parse<'a>(tokens: &'a Vec<Token<'a>>) -> Node<'a> {
let mut root = Node::new(ParseState::Expr);
let mut parser = Parser {
index: 0,
tokens: tokens,
};
parser.parse_block(&mut root);
root
}
struct Parser<'a> {
index: usize,
tokens: &'a Vec<Token<'a>>,
}
impl<'a> Parser<'a> {
fn parse_block(&mut self, parent: &mut Node) {
loop {
let mut row = Node::new(ParseState::Expr);
match self.peek() {
Some(_) => {
self.parse_row(&mut row);
}
None => {
break;
}
}
parent.push_if(row);
}
}
fn parse_row(&mut self, parent: &mut Node) {
loop {
match self.next() {
Some(ref token) => match token.state {
TokenState::VSpace => break,
_ => {
parent.kids.push(Node::new_token(&token));
}
},
None => break,
}
}
}
fn next(&mut self) -> Option<&Token> {
let index = self.index;
if index < self.tokens.len() {
self.index += 1;
}
self.tokens.get(index)
}
fn peek(&mut self) -> Option<&Token> {
self.tokens.get(self.index)
}
}
fn main(){
println!(“你好,世界!”);
}
#[导出(调试)]
发布结构令牌>,
州:州,,
令牌:选项>,
}
恳求{
fn新建(状态:ParseState)->节点{
//TODO控制状态?某些令牌状态?
节点{
孩子们:vec![],
状态:ParseState::Expr,
令牌:一些(&令牌),
}
}
fn push_if和mut self,节点:节点(令牌:&'a Vec{
让mut root=Node::new(ParseState::Expr);
让mut parser=parser{
索引:0,
代币:代币,
};
parser.parse_块(&mut root);
根
}
结构分析器src/main.rs:72:1
|
72 |/impl{
73 | | fn parse_块(&mut self,parent:&mut Node){
74 | |环{
75 | |让mut row=Node::new(ParseState::Expr);
... |
112| | }
113| | }
| |_^
注意:…因此类型`Parser,found Node让我们看看Parser::next的签名:
fn next(&mut self) -> Option<&Token>
我们这里又有一些省略的生命周期。让我们把它们拼出来:
fn parse_row<'b, 'c, 'd>(&'b mut self, parent: &'c mut Node<'d>)
现在,一个匿名生存期被标识为'd
。另一个仍然是匿名生存期,这是编译器如何操作生存期的产物,但我们可以将其视为'b
现在问题应该更清楚了:我们正在尝试推送一个节点
对象。重要的是类型必须是节点
fn parse_row(&mut self, parent: &mut Node)
fn parse_row<'b, 'c, 'd>(&'b mut self, parent: &'c mut Node<'d>)
fn next(&mut self) -> Option<&'a Token<'a>>
fn parse_row(&mut self, parent: &mut Node<'a>)
fn parse_block(&mut self, parent: &mut Node)
fn parse_block<'b, 'c, 'd>(&'b mut self, parent: &'c mut Node<'d>)
fn parse_block(&mut self, parent: &mut Node<'a>)