使用运行时创建的实例的首选方法是什么?

时间:2017-07-08 11:21:47

标签: rust

我正在编写一个服务,它将收集大量的值并围绕它们构建大型结构。对于其中一些,需要查找表,并且由于内存限制,我不想复制传递给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()释放借用,但即使实际上已经这样做了,也许编译器无法解决这个问题?

1 个答案:

答案 0 :(得分:2)

  

另外,我期待clear()释放借用,但即使实际上这样做,也许编译器无法解决这个问题?

目前,借款纯粹以范围为基础。只有消费借款人的方法才能撤销借款,这并不总是理想的。

  

使用共享运行时创建的实例的首选方法是什么?

表达共享所有权的最简单方法是使用共享所有权。它确实带来了一些语法开销,但它会大大简化推理。

在Rust中,有两种简单的标准方式来表达共享所有权:

  • Rc<RefCell<T>>,用于在线程内共享
  • Arc<Mutex<T>>,用于跨线程共享。

有一些变体(使用Cell代替RefCellRWLock代替Mutex),但这些是基础知识。

除了语法开销之外,还有一些运行时开销进入(a)每当你进行克隆时增加/减少引用计数;(b)在访问包装的实例时检查/标记/清除使用标志T

但这种方法有一个不可忽视的缺点。现在在运行时而不是编译时检查借用规则,因此违规导致panic而不是编译时错误。