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

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

從HashMap或Vec返回引用會導致借用超出其范圍?

從HashMap或Vec返回引用會導致借用超出其范圍?

森欄 2019-07-09 15:35:16
從HashMap或Vec返回引用會導致借用超出其范圍?我遇到了一個持續的編譯錯誤,Rust抱怨我在嘗試不斷地借款時有一個不可變的借入,但是不變的借入來自另一個范圍,而且我不會從它帶來任何東西。我有一些代碼來檢查映射中的值,如果它是存在的,就返回它,否則它需要以各種方式修改映射。問題是,我似乎找不到一種方法讓RUST讓我做這兩種操作,即使這兩個操作是完全分開的。下面是一些與我的代碼結構相同的荒謬代碼,并展示了問題所在:use std::collections::BTreeMap;fn do_stuff(map: &mut BTreeMap<i32, i32>, key: i32) -> Option<&i32> {     // extra scope in vain attempt to contain the borrow     {         // borrow immutably         if let Some(key) = map.get(&key) {             return Some(key);         }     }     // now I'm DONE with the immutable borrow, but rustc still thinks it's borrowed     map.insert(0, 0); // borrow mutably, which errors     None}此錯誤包括:error[E0502]: cannot borrow `*map` as mutable because it is also borrowed as immutable   --> src/lib.rs:14:5    | 3  | fn do_stuff(map: &mut BTreeMap<i32, i32>, key: i32) -> Option<&i32> {    |                  - let's call the lifetime of this reference `'1` ... 7  |         if let Some(key) = map.get(&key) {    |                            --- immutable borrow occurs here 8  |             return Some(key);    |                    --------- returning this value requires that `*map` is borrowed for `'1` ... 14 |     map.insert(0, 0); // borrow mutably, which errors    |     ^^^^^^^^^^^^^^^^ mutable borrow occurs here這對我來說毫無意義。不可變的借入怎么會比那個范圍更長?!其中一個分支match通過return而另一個則什么也不做就離開了范圍。我以前見過這種情況,我在其他變量中錯誤地將借款從范圍外走私出去,但這里不是這樣的!是的,借用是通過return語句,但這是荒謬的,阻止借入更低的功能-程序不可能返回并繼續前進!如果我在那里返回其他東西,錯誤就會消失,所以我認為這就是借閱檢查程序被掛起來的原因。我覺得這就像個蟲子。不幸的是,我一直無法找到任何方法來重寫它而不會碰到同樣的錯誤,所以如果是這樣的話,這是一個特別令人討厭的錯誤。
查看完整描述

2 回答

?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

不幸的是,.entry()不適合此函數所需的操作。我意識到了非詞匯范圍的問題,通常我可以解決這個問題,但在這種情況下,我還沒能想出一些不做重復工作的東西,不管解決辦法有多么丑陋…。另外,通常添加一個作用域可以解決這個問題,但在這里它并不有效;即使將一個借入到另一個函數也沒有幫助。

查看完整回答
反對 回復 2019-07-09
  • 2 回答
  • 0 關注
  • 464 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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