【问题标题】:How do I pass an iterator I am iterating on to a function?如何将我正在迭代的迭代器传递给函数?
【发布时间】:2015-04-15 16:25:07
【问题描述】:

我正在迭代一个数组,根据当前值,我想将迭代器传递给一个子函数并让它处理多个值,并在退出子函数时继续迭代通过数组。以下是我迄今为止最接近的,但我不断收到error: use of moved value: 'iter'

我尝试过研究生命周期,但这对我也不起作用。我已经花了一天的大部分时间在这上面,而且似乎无处可去。任何帮助将不胜感激。谢谢。

enum Thing {
    Three(char, char, char),
    Four(char, char, char, char),
}

fn take_three <'a>(iter: &mut std::slice::Iter<'a, char>) -> Thing {
    let a = iter.next().unwrap();
    let b = iter.next().unwrap();
    let c = iter.next().unwrap();
    Thing::Three(*a,*b,*c)
}

fn take_four <'a>(iter: &mut std::slice::Iter<'a, char>) -> Thing {
    let a = iter.next().unwrap();
    let b = iter.next().unwrap();
    let c = iter.next().unwrap();
    let d = iter.next().unwrap();
    Thing::Four(*a,*b,*c,*d)
}

fn parse_tokens (tokens: &Vec<char>) {
    let mut iter = tokens.iter();
    let mut things: Vec<Thing> = vec![];
    for token in iter {
        match token {
            &'a' => things.push(take_three(&mut iter)),
            &'b' => things.push(take_four(&mut iter)),
            _ => {},
        }
    }
}

fn main() {
    let tokens = vec!['a', '1', '2', '3', 'b', '1', '2', '3', '4', 'a', '4', '5', '6'];
    parse_tokens(&tokens);
}

【问题讨论】:

  • “继续迭代”是否意味着您将重置您的位置0, 1, (2, 3), 2, 3 或者您将只触摸每个事物一次0, 1, (2, 3), 4, 5
  • 每个元素只触摸一次。

标签: iterator rust


【解决方案1】:

for 构造会消耗迭代器,使用它做你想做的事情会非常棘手(如果不是不可能的话,我真的不确定)。

但是,您可以通过切换到 while let 构造来让它很容易地工作,如下所示:

fn parse_tokens (tokens: &Vec<char>) {
    let mut iter = tokens.iter();
    let mut things: Vec<Thing> = vec![];
    while let Some(token) = iter.next() {
        match token {
            &'a' => things.push(take_three(&mut iter)),
            &'b' => things.push(take_four(&mut iter)),
            _ => {},
        }
    }
}

【讨论】:

  • @GeorgeRoger Here 是相关的 RFC。它基于if let 语法。
猜你喜欢
  • 1970-01-01
  • 2019-12-10
  • 2013-06-03
  • 2019-12-23
  • 2012-07-23
  • 2014-06-26
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多