在 `std::string::String` 中找不到 .next() 方法

.next() method not found in `std::string::String`

我有一个包含类似内容的文件:

144NFFFFL

我希望能够读取每个字符并始终通过解析将前 3 个字符转换为整数 (i32)。出于某种原因,我的 .next() 调用无法编译。

fn main() {
    let mut test = Robot::new(0, 3, 4, Orientation::N, vec![Direction::F, Direction::F]);
    println!("id = {:#?} , x = {:#?} , y = {:#?} , ori = {:#?} , dir = {:#?} ,",test.id,test.x,test.y,test.orientation,test.direction);

    let mut file = File::open("instruction.txt").expect("Impossible d'ouvrire le fichier"); //ouverture du fichier instruction.txt et le stock dans la var mut
    let mut contenue = String::new();
    file.read_to_string(&mut contenue).expect("Impossible de lire le fichier");
    contenue = line!(.split_whitespace()).to_string();
    
    let mut tmp = (contenue.next()).to_string();
    test.id = tmp.parse::<i32>().unwarp();

    tmp = (contenue.next()).to_string();
    test.x = tmp.parse::<i32>().unwarp();

    tmp = (contenue.next()).to_string();
    test.y = tmp.parse::<i32>().unwarp();

    tmp = contenue.next();
    test.orientation = tmp;
}

错误=>

let mut tmp = (contenue.next()).to_string();
    |                             ^^^^ method not found in `std::string::String`

error[E0599]: no method named `next` found for struct `std::string::String` in the current scope
   --> src/main.rs:120:21
    |
120 |     tmp = (contenue.next()).to_string();
    |                     ^^^^ method not found in `std::string::String`

error[E0599]: no method named `next` found for struct `std::string::String` in the current scope
   --> src/main.rs:123:21
    |
123 |     tmp = (contenue.next()).to_string();
    |                     ^^^^ method not found in `std::string::String`

error[E0599]: no method named `next` found for struct `std::string::String` in the current scope
   --> src/main.rs:126:20
    |
126 |     tmp = contenue.next();
    |                    ^^^^ method not found in `std::string::String`

error[E0599]: no method named `next` found for struct `std::string::String` in the current scope
   --> src/main.rs:131:36
    |
131 |         let carac = match contenue.next()
    |                                    ^^^^ method not found in `std::string::String

next() 是一个 iterator method. To use it, you need an iterator for your String. Usually that's chars().

let iter = contenue.chars();

一旦有了字符迭代器,就可以使用 take(3) 仅迭代前 3 个字符。然后使用 collect() 将它们连接成一个字符串。那就parse吧。

let id: u32 = iter
    .take(3)
    .collect::<String>()
    .parse::<u32>()
    .unwrap();
println!("ID = {}", id);

因为这是一个迭代器,所以它会记住它的位置。对 iter.next() 的下一次调用将是 N。这样我们就可以打印出剩下的字符了。

for c in iter {
    println!("c = {}", c);
} 
error[E0382]: use of moved value: `iter`
  --> test.rs:12:14
   |
3  |     let iter = contenue.chars();
   |         ---- move occurs because `iter` has type `std::str::Chars<'_>`, which does not implement the `Copy` trait
4  |     
5  |     let id: u32 = iter
   |                   ---- value moved here
...
12 |     for c in iter {
   |              ^^^^ value used here after move

问题是 iter.take() 取得了迭代器的所有权。我们需要使用by_ref()来借用它。我们需要使迭代器可变。

fn main() { 
    let contenue = "144NFFFFL";
    let mut iter = contenue.chars();
    
    let id: u32 = iter
        .by_ref()
        .take(3)
        .collect::<String>()
        .parse::<u32>()
        .unwrap();
    println!("ID = {}", id);   
    
    for c in iter {
        println!("c = {}", c);
    } 
}