2017-07-15 14 views
0

は、私は次のコードを持っている:私は時々charsで文字をスキップする必要があるため反復でスキップできるうちに、どのように文字リストを反復処理するのですか?

let mut lex_index = 0; 
let chars = expression.chars(); 
while lex_index < chars.count() { 
    if(chars[lex_index] == "something") { 
     lex_index += 2; 
    } else { 
     lex_index += 1; 
    } 
} 

は、私がここにwhileループを使用します。最初の後nextを呼んですべての問題を回避するために

let mut chars = "gravy train".chars().fuse(); 

while let Some(c) = chars.next() { 
    if c == 'x' { 
     chars.next(); // Skip the next one 
    } 
} 

我々はイテレータをfuse

error[E0382]: use of moved value: `chars` 
    --> src/main.rs:23:15 
    | 
23 |  while i < chars.count() { 
    |    ^^^^^ value moved here in previous iteration of loop 
    | 
    = note: move occurs because `chars` has type `std::str::Chars<'_>`, which does not implement the `Copy` trait 
+0

'の文字を<>'イテレータではなく、コレクションですので、あなたはそのようにとにかくそれへのインデックスすることはできません。 – ildjarn

+1

文字列をスキップしたいときに 'continue'を使用してください。 – Boiethios

+0

これは本当に気づいていますが、これは私が探している動作の種類を説明するために思いついたコードです。 – duck

答えて

6

それはインデックスを使用するのではなく、何かを反復すると良いでしょう: はしかし、これは私に次のエラーを与えますNoneが返されます。


あなたのコードでは、多くの問題があります。

  1. Iterator::countはイテレータを消費します。いったん呼び出すと、イテレーターはとなり、になります。それがあなたのエラーの原因です。別の解決策は、Iterator::by_refを使用して、あなたが数えるイテレータを消費することが行末でないようにすることです。

  2. charsは、インデックス付けをサポートしないタイプCharsです。 chars[lex_index]は無意味です。

  3. charと文字列を比較できないため、chars[lex_index] == "something"もコンパイルされません。 Chars::as_strを使用する可能性はありますが、Fuseをあきらめて、それを自分で処理する必要があります。

2

あなたはこのためにstrcursorクレートを使用することができます。

extern crate strcursor; 

fn main() { 
    use strcursor::StrCursor; 
    let expr = r"abc\xdef"; 
    let mut cur = StrCursor::new_at_start(expr); 

    // `after`: the next grapheme cluster 
    while let Some(gc) = cur.after() { 
     if gc == "\\" { 
      // Move right two grapheme clusters. 
      cur.seek_next(); 
      cur.seek_next(); 
     } else { 
      print!("{}", gc); 
      cur.seek_next(); 
     } 
    } 
    println!(""); 
} 

// Output: `abcdef` 
関連する問題