問題描述
此問題來自于Rust社群,連結位址:https://users.rust-lang.org/t/why-must-i-mutably-borrow-struct-if-method-result-is-while-loop-condition/36310
在問題中,題主使用如下代碼讀取檔案内容Ok:
//第一段代碼
use std::io::{self,BufRead};
use std::fs::File;
fn main() -> std::result::Result<(), std::io::Error> {
let filename = "test.bed";
let fi = File::open(filename)?;
let bedreader = io::BufReader::new(fi); //注意,bedreader不是mutable
for line in bedreader.lines() {
println!("{}", line?);
}
Ok(())
}
但是當換成如下代碼後,出錯:
//第二段代碼
use std::io::{self,BufRead};
use std::fs::File;
fn main() -> std::result::Result<(), std::io::Error> {
let filename = "test.bed";
let fi = File::open(filename)?;
let bedreader = io::BufReader::new(fi); //注意,bedreader不是mutable
let mut line = String::new();
while bedreader.read_line(&mut line).unwrap() > 0 {//此處報錯
println!("{}", line.trim_end());
line.clear();
}
Ok(())
}
在第二段代碼中,題主認為試用while循環讀取内容,line已經定義成mutable的了,不應該出錯。
問題解決
對于第二段代碼,進行如下修改後就能正确運作,如下:
//對第二段代碼修正
use std::io::{self,BufRead};
use std::fs::File;
fn main() -> std::result::Result<(), std::io::Error> {
let filename = "test.bed";
let fi = File::open(filename)?;
let mut bedreader = io::BufReader::new(fi); //注意,bedreader是mutable
let mut line = String::new();
while bedreader.read_line(&mut line).unwrap() > 0 {//此處不再報錯
println!("{}", line.trim_end());
line.clear();
}
Ok(())
}
問題解釋
在第一段代碼中,在for循環中使用的是通過bedreader.lines()讀取每一行,而該方法的定義為:
fn lines(self) -> Lines<Self>
fn read_line(&mut self, buf: &mut String) -> Result<usize>