Iterator Rust可以使用传递到函数中的迭代器吗?

Iterator Rust可以使用传递到函数中的迭代器吗?,iterator,rust,move-semantics,ownership-semantics,Iterator,Rust,Move Semantics,Ownership Semantics,我试图在Rust中实现一个简单的REPL计算器,我到处碰壁 我在对硬编码字符串进行迭代时使用字符。当我点击一个数字字符时,我希望将控制权传递给一个函数,该函数将使用该数字的其余部分(假设该数字有多个数字),并返回转换为整数的数字 我在向函数传递Chars迭代器时遇到问题。我得到的错误是使用移动值:“iter” 我知道我不能改变我给别人的东西——所有权被转移的东西——但我不知道还有什么其他方法可以做到这一点,特别是因为Chars迭代器是不可复制的 #[derive(Clone, Debug)] e

我试图在Rust中实现一个简单的REPL计算器,我到处碰壁

我在对硬编码字符串进行迭代时使用字符。当我点击一个数字字符时,我希望将控制权传递给一个函数,该函数将使用该数字的其余部分(假设该数字有多个数字),并返回转换为整数的数字


我在向函数传递
Chars
迭代器时遇到问题。我得到的错误是
使用移动值:“iter”

我知道我不能改变我给别人的东西——所有权被转移的东西——但我不知道还有什么其他方法可以做到这一点,特别是因为Chars迭代器是不可复制的

#[derive(Clone, Debug)]
enum Token {
    Addition,
    Substraction,
    Multiplication,
    Division,
    Integer(i32),
    Error,
}

fn consume_number(mut iter: std::str::Chars) -> Option<i32> {
    while let Some(item) = iter.next() {
        println!("{:?}", item);
    }

    return Some(1337);
}

fn tokenize(line: &str) -> Vec<Token> {
    let mut iter = line.chars();
    let mut tokens = Vec::new();
    let mut token;

    while let Some(c) = iter.next() {
        if c.is_whitespace() { continue };

        if c.is_digit(10) {
            token = match consume_number(iter) {
                Some(i32) => Token::Integer(i32),
                None => Token::Error,
            };
        } else {
            token = match c {
                '+'                    => Token::Addition,
                '-'                    => Token::Substraction,
                '*'                    => Token::Multiplication,
                '/'                    => Token::Division,
                _                      => Token::Error,
            };
        };
        tokens.push(token);
    }
    return tokens;
}



fn main() {
    let line = "631 * 32 + 212 - 15 / 89";
    println!("{:?}", tokenize(&line));
}
#[派生(克隆、调试)]
枚举令牌{
附加
减法,
乘法,
分部,
整数(i32),
错误,
}
fn消耗_编号(mut iter:std::str::Chars)->选项{
而让一些(项目)=iter.next(){
println!(“{:?}”,项目);
}
返回一些(1337);
}
fn标记化(行:&str)->Vec{
设mut iter=line.chars();
让mut tokens=Vec::new();
让mut标记;
而让一些(c)=iter.next(){
如果c.is_whitespace(){continue};
如果c.是_位(10){
令牌=匹配消费号(iter){
Some(i32)=>Token::Integer(i32),
None=>Token::Error,
};
}否则{
令牌=匹配c{
“+”=>Token::Addition,
'-'=>标记::减法,
'*'=>令牌::乘法,
“/”=>令牌::除法,
_=>令牌::错误,
};
};
代币。推送(代币);
}
归还代币;
}
fn main(){
让line=“631*32+212-15/89”;
println!(“{:?}”,标记化(&line));
}

答案是肯定的,它是在迭代器的
特性中完成的

您在这里的体验更为基本:

fn consume_number(mut iter: std::str::Chars) -> Option<i32> { ... }

while let Some(c) = iter.next() {
    ...
    match_consume_number(iter)
    ...
}

你很接近

答案是肯定的,它是在
fromtiterator
trait中完成的

您在这里的体验更为基本:

fn consume_number(mut iter: std::str::Chars) -> Option<i32> { ... }

while let Some(c) = iter.next() {
    ...
    match_consume_number(iter)
    ...
}

你很接近

非常感谢您,非常好的先生!顺便问一句,你怎么知道问题是iter在while循环中超出了范围?是什么泄露的?我应该一直在寻找什么?
使用移动值:“iter”。
意味着
iter
的所有权转移到了其他东西上。Rust中的“移动”表示“转移所有权”。你会习惯的;)@neektza:iter并没有“超出范围”,但这是一个不同的概念。当您尝试使用“超出范围”的标识符时,会出现“未解析名称”错误。这不是这里发生的事!非常感谢您,非常好的先生!顺便问一句,你怎么知道问题是iter在while循环中超出了范围?是什么泄露的?我应该一直在寻找什么?
使用移动值:“iter”。
意味着
iter
的所有权转移到了其他东西上。Rust中的“移动”表示“转移所有权”。你会习惯的;)@neektza:iter并没有“超出范围”,但这是一个不同的概念。当您尝试使用“超出范围”的标识符时,会出现“未解析名称”错误。这不是这里发生的事!