我正在编写一个服务,它将收集大量的值并围绕它们构建大型结构。对于其中一些,需要查找表,并且由于内存限制,我不想复制传递给HashMap
的键或值。但是,使用引用会让我遇到借用检查器的问题(参见下面的示例)。使用运行时创建的实例的首选方法是什么?
use std::collections::HashMap;
#[derive(PartialEq, Eq, PartialOrd, Ord, Hash)]
struct LargeKey;
struct LargeValue;
fn main() {
let mut lots_of_lookups: HashMap<&LargeKey, &LargeValue> = HashMap::new();
let run_time_created_key = LargeKey;
let run_time_created_value = LargeValue;
lots_of_lookups.insert(&run_time_created_key, &run_time_created_value);
lots_of_lookups.clear();
}
我期待clear()
释放借用,但即使实际上已经这样做了,也许编译器无法解决这个问题?
答案 0 :(得分:2)
另外,我期待
clear()
释放借用,但即使实际上这样做,也许编译器无法解决这个问题?
目前,借款纯粹以范围为基础。只有消费借款人的方法才能撤销借款,这并不总是理想的。
使用共享运行时创建的实例的首选方法是什么?
表达共享所有权的最简单方法是使用共享所有权。它确实带来了一些语法开销,但它会大大简化推理。
在Rust中,有两种简单的标准方式来表达共享所有权:
Rc<RefCell<T>>
,用于在线程内共享Arc<Mutex<T>>
,用于跨线程共享。有一些变体(使用Cell
代替RefCell
或RWLock
代替Mutex
),但这些是基础知识。
除了语法开销之外,还有一些运行时开销进入(a)每当你进行克隆时增加/减少引用计数;(b)在访问包装的实例时检查/标记/清除使用标志T
。
但这种方法有一个不可忽视的缺点。现在在运行时而不是编译时检查借用规则,因此违规导致panic
而不是编译时错误。