作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
改变结构)并将其缓存在 Rust 中返回。 我收到以下错误消息: error[E0499]: -6ren">
我必须迭代键,通过键在 HashMap 中找到值,可能在找到的结构中作为值进行一些繁重的计算(惰性 => 改变结构)并将其缓存在 Rust 中返回。
我收到以下错误消息:
error[E0499]: cannot borrow `*self` as mutable more than once at a time
--> src/main.rs:25:26
|
23 | fn it(&mut self) -> Option<&Box<Calculation>> {
| - let's call the lifetime of this reference `'1`
24 | for key in vec!["1","2","3"] {
25 | let result = self.find(&key.to_owned());
| ^^^^ `*self` was mutably borrowed here in the previous iteration of the loop
...
28 | return result
| ------ returning this value requires that `*self` is borrowed for `'1`
这是
code in playground 。
use std::collections::HashMap;
struct Calculation {
value: Option<i32>
}
struct Struct {
items: HashMap<String, Box<Calculation>> // cache
}
impl Struct {
fn find(&mut self, key: &String) -> Option<&Box<Calculation>> {
None // find, create, and/or calculate items
}
fn it(&mut self) -> Option<&Box<Calculation>> {
for key in vec!["1","2","3"] {
let result = self.find(&key.to_owned());
if result.is_some() {
return result
}
}
None
}
}
self
和结构),因为可能的计算会改变它最佳答案
您不能使用独占访问进行缓存。您不能将 Rust 引用视为通用指针(顺便说一句:&String
和 &Box<T>
是双重间接,在 Rust 中非常不习惯。使用 &str
或 &T
进行临时借用)。&mut self
意味着不只是可变的,而是排他的和可变的,所以你的缓存支持只返回一项,因为它返回的引用必须保持 self
只要它存在就“锁定”。
您需要让借用检查员相信 find
下次调用时返回不会突然消失。目前没有这样的保证,因为接口(interface)不会阻止你调用例如items.clear()
(借用检查器检查函数的接口(interface)允许什么,而不是函数实际执行什么)。
您可以使用 Rc
来做到这一点。 ,或使用实现 a memory pool/arena 的 crate .
struct Struct {
items: HashMap<String, Rc<Calculation>>,
}
fn find(&mut self, key: &str) -> Rc<Calculation>
这样,如果您克隆
Rc
,它会在需要的时间内存活,与缓存无关。
struct Struct {
items: RefCell<HashMap<…
}
这将允许您内存
find
使用共享借用而不是独占借用的方法:
fn find(&self, key: &str) -> …
对于方法的调用者来说,这更容易使用。
关于rust - 如何在 Rust 中修复 ".. was mutably borrowed here in the previous iteration of the loop"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66167634/
我是一名优秀的程序员,十分优秀!