Parsing 如何在Rust中将相同的可变Peekable传递给不同的函数

Parsing 如何在Rust中将相同的可变Peekable传递给不同的函数,parsing,rust,iterator,mutable,Parsing,Rust,Iterator,Mutable,我想写一个解析器。 对我来说,拥有一个可变的迭代器,我可以将它传递给不同的解析器函数,这似乎很实用 我试图说明一种简化的方法,它可以编译,但还不理想 fn main() { let tokens = vec!["fIrSt".to_string(), "SeConD".to_string(), "tHiRd".to_string(), "FoUrTh".to_string()]; let parsed = parse_input(tokens); println!("

我想写一个解析器。 对我来说,拥有一个可变的
迭代器
,我可以将它传递给不同的解析器函数,这似乎很实用

我试图说明一种简化的方法,它可以编译,但还不理想

fn main() {
    let tokens = vec!["fIrSt".to_string(), "SeConD".to_string(), "tHiRd".to_string(), "FoUrTh".to_string()];

    let parsed = parse_input(tokens);

    println!("{}", parsed);
}

fn parse_input(tokens: Vec<String>) -> String {
    let mut tokens_iter = tokens.iter();

    let upps = parse_upper(&mut tokens_iter);
    let lowers = parse_lower(&mut tokens_iter);

    upps + &lowers
}

fn parse_upper(tokens_iter: &mut Iterator<Item=&String>) -> String {
    let mut result = String::new();
    let token_1 = tokens_iter.next().unwrap().to_uppercase();
    let token_2 = tokens_iter.next().unwrap().to_uppercase();
    result.push_str(&token_1);
    result.push_str(&token_2);
    result
}

fn parse_lower(tokens_iter: &mut Iterator<Item=&String>) -> String {
    let mut result = String::new();
    let token_1 = tokens_iter.next().unwrap().to_lowercase();
    let token_2 = tokens_iter.next().unwrap().to_lowercase();
    result.push_str(&token_1);
    result.push_str(&token_2);
    result
}
fn main(){
让tokens=vec![“第一”。to_string(),“第二”。to_string(),“第三”。to_string(),“第四”。to_string();
让parsed=parse_输入(令牌);
println!(“{}”,已解析);
}
fn parse_输入(令牌:Vec)->字符串{
让mut tokens_iter=tokens.iter();
设upps=parse_upper(&mut tokens_iter);
let lowers=parse_lower(&mut tokens_iter);
upps+&降低
}
fn parse_upper(标记:和mut迭代器)->String{
让mut result=String::new();
让token_1=tokens_iter.next().unwrap().to_大写();
让token_2=tokens_iter.next().unwrap().to_大写();
结果:推送符号(和标记符号1);
结果:推送符号(和标记符号2);
结果
}
fn parse_lower(标记:和mut迭代器)->String{
让mut result=String::new();
让token_1=tokens_iter.next().unwrap().to_lowercase();
让token_2=tokens_iter.next().unwrap().to_lowercase();
结果:推送符号(和标记符号1);
结果:推送符号(和标记符号2);
结果
}
示例的工作原理: 假设我有一些输入,已经标记化了。这里它由
标记
向量(
Vec
)表示。 在外部
parse_input
函数中,
Vec
被转换成一个
迭代器,然后被传递到不同的特定解析器函数中。这里:
parse\u upper
parse\u lower
。在现实生活中,这些可能是“parse_if_statement”或“parse_while_loop”,但是
迭代器的哪个部分得到处理与问题无关。
与此相关的是,对next的每次调用都会将光标向前移动到
迭代器上。这样每个函数都会消耗它所需要的片段。
此示例编译并给出输出:
FIRSTSECONDthirdfourth

我希望在将其传递给函数之前,能够将
peek()
插入到
迭代器中。这是确定实际应调用哪个函数所必需的。但是,我尝试使用
peek
而不是
Iterator
的所有方法都会导致整个生命周期和借用混乱

关于在这种情况下如何传递可查看的
而不是
迭代器的建议?


首先,使用
peakable
作为函数参数可能是个坏主意。或者可能我的
迭代器
方法已经错了。欢迎所有建议/提示

如果你要做一个全功能的词法分析器/语法分析器,只需要使用一个像这样的库。你为什么认为这是一个混乱,您只是告诉迭代器中的项位于调用函数的位置。@ÖmerErden非常感谢您!这正是我要找的,但不太合适。我对泛型和生命周期缺乏了解。@niilz啊,好吧!通常,在对代码进行词法分析之后,您没有拥有的字符串,而是片段。然后,你可以随意“窥视”它们。如果你要做一个全功能的词法分析器/解析器,只需使用像这样的库。你为什么认为这是一个混乱,您只是告诉迭代器中的项位于调用函数的位置。@ÖmerErden非常感谢您!这正是我要找的,但不太合适。我对泛型和生命周期缺乏了解。@niilz啊,好吧!通常,在对代码进行词法分析之后,您没有拥有的字符串,而是片段。然后,你可以“偷看”他们,你想看多少就看多少。