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