我有以下(夠單純)防鏽代碼:不能借用富爲永恆不變的,因爲它也被借用爲可變
let file = &Path(some_file_name);
let mut buf = [0u8, ..12];
match io::file_reader(file) {
Ok(reader) => reader.read(buf, buf.len()),
Err(msg) => println(msg)
}
的rustc
抱怨
不能借用
buf[]
爲永恆不變的,因爲它是也借用爲可變
如果將相應的行更改爲:
Ok(reader) => reader.read(buf, 12),
一切都會正常工作。但是由於現在緩衝區的長度在代碼中是重複的,所以不太令人滿意。雖然模糊地理解爲什麼rustc
抱怨,我仍然想要說rustc
應該能夠推斷出len()
是一個純函數,並且沒有副作用,所以代碼是有效的。另外,以這種方式讀取緩衝區是一個相當常見的模式。
那麼這裏慣用的Rust方式是什麼?
編輯:代碼爲Rust 0.8。正如@ pnkfelix指出的那樣,Reader.read
API自那時以來一直在改變。它不再需要第二個參數。
小心提供您的完整代碼?我根據你的代碼拼湊了一些東西,但是我得到了一個不同的錯誤。你使用什麼版本的鐵鏽? – asm
順便說一句,當'Path'爲Path分配一個盒子時,可以將Path直接放在堆棧上並對其進行正常引用,例如, '&Path'。 – huon
安德魯,代碼爲鏽0.8。 dbaupp,的確如此。 '&Path'會更好。 – edwardw