亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法借用不可變,因為它在函數參數中也借來可變

無法借用不可變,因為它在函數參數中也借來可變

Git
交互式愛情 2019-11-04 10:20:09
這是怎么回事(操場)?struct Number {    num: i32}impl Number {    fn set(&mut self, new_num: i32) {        self.num = new_num;    }    fn get(&self) -> i32 {        self.num    }}fn main() {    let mut n = Number{ num: 0 };    n.set(n.get() + 1);}給出此錯誤:error[E0502]: cannot borrow `n` as immutable because it is also borrowed as mutable  --> <anon>:17:11   |17 |     n.set(n.get() + 1);   |     -     ^          - mutable borrow ends here   |     |     |   |     |     immutable borrow occurs here   |     mutable borrow occurs here但是,如果您只是簡單地將代碼更改為此:fn main() {    let mut n = Number{ num: 0 };    let tmp = n.get() + 1;    n.set(tmp);}對我來說,這些看起來完全等效-我的意思是,我希望前者在編譯時會轉換為后者。Rust不會在評估下一級函數調用之前評估所有函數參數嗎?
查看完整描述

1 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

這行:


n.set(n.get() + 1);

被減為


Number::set(&mut n, n.get() + 1);

現在,錯誤消息可能會更加清楚:


error[E0502]: cannot borrow `n` as immutable because it is also borrowed as mutable

  --> <anon>:18:25

   |

18 |     Number::set(&mut n, n.get() + 1);

   |                      -  ^          - mutable borrow ends here

   |                      |  |

   |                      |  immutable borrow occurs here

   |                      mutable borrow occurs here

當Rust從左到右評估參數時,該代碼與此等效:


let arg1 = &mut n;

let arg2 = n.get() + 1;

Number::set(arg1, arg2);

現在應該很明顯出了什么問題。交換前兩行即可解決此問題,但Rust不會進行這種控制流分析。


它最初是作為Bug#6268創建的,現在已集成到RFC 2094(非詞法生存期)中。如果您使用Rust 2018,則會自動啟用NLL,并且您的代碼現在將編譯而不會出現錯誤。


查看完整回答
反對 回復 2019-11-04
  • 1 回答
  • 0 關注
  • 860 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號