問題描述
fn main() {
let mut x = 5;
let y = &mut x;
println!("{}", x);
println!("{}", y);
}
使用 https://play.rust-lang.org/ 編譯報(bào)錯(cuò):
Compiling playground v0.0.1 (/playground)
error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable
--> src/main.rs:4:20
|
3 | let y = &mut x;
| ------ mutable borrow occurs here
4 | println!("{}", x);
| ^ immutable borrow occurs here
5 | println!("{}", y);
| - mutable borrow later used here
error: aborting due to previous error
For more information about this error, try `rustc --explain E0502`.
error: could not compile `playground`
To learn more, run the command again with --verbose.
但是 把輸出代碼調(diào)換一下順序,就可以編譯通過了
fn main() {
let mut x = 5;
let y = &mut x;
println!("{}", y);
println!("{}", x);
}
輸出:
Compiling playground v0.0.1 (/playground)
Finished dev [unoptimized + debuginfo] target(s) in 0.84s
Running `target/debug/playground`
Standard Output
5
5
網(wǎng)友的解答
網(wǎng)友:freedom967
你的寫法實(shí)際上違背了借用規(guī)則,x被可變借出后酷誓,在當(dāng)前作用域下州弟,你是不能再訪問x的,因?yàn)檫@個(gè)違背了可變借用和不可變不能同時(shí)存在的原則,沒錯(cuò),x被借出后,原則上你是不能再訪問x的仔蝌。泛领。荒吏。為什么調(diào)換順序后可以,那是rust編譯器的鍋渊鞋,因?yàn)樗袛鄖在后面不再被使用(也就是可變借用到這里結(jié)束了)绰更,所以這時(shí)候你訪問x是可以的,非詞法作用域的功勞锡宋,簡(jiǎn)化了實(shí)際代碼編寫的儡湾。謹(jǐn)記rust的借用規(guī)則才是重點(diǎn)。
網(wǎng)友:catsalwaysmeow
不清楚這個(gè)資料有沒有過時(shí)执俩,可以參考一下:https://github.com/rust-lang/rfcs/blob/master/text/2094-nll.md
借用的生命周期是囊括了這個(gè)借用被使用的每一個(gè)時(shí)間點(diǎn)的最小范圍徐钠。第一份代碼中,打印x時(shí)役首,可變借用y仍然存活(因?yàn)橹筮€要打印y)敷鸦,那么x仍處于被借用中的凍結(jié)狀態(tài)亮蛔,所以報(bào)錯(cuò)了。第二份代碼中,打印x時(shí)辆亏,y的生命周期已經(jīng)結(jié)束了,因?yàn)樗且粋€(gè)借用评雌。
另外一位網(wǎng)友:eric642的解釋:
fn main() {
let mut x = 5; -----------x的生命周期
let y = &mut x; =====y的生命周期
println!("{}", y); =====>end
println!("{}", x); -------->end
}
fn main() {
let mut x = 5; -----------x的生命周期
let y = &mut x; =====y的生命周期
println!("{}", x); -------->end
println!("{}", y); =====>end
}
引用的生命周期不能小于被引用的.
原文地址:https://rustcc.cn/article?id=1939f5db-6a18-4617-8c87-417447698fad