在 `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);
}
}
我有一个包含类似内容的文件:
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);
}
}