为什么Rust强制执行对象只能被可变地借用一次?

时间:2017-03-16 18:53:35

标签: pointers types rust type-systems

还没有Send / Sync吗?官方文件只提到它与数据竞赛有关。

1 个答案:

答案 0 :(得分:5)

由于记忆安全

考虑这个例子(忽略这一事实,如果它编译会导致无限循环):

let mut list = vec![1, 2, 3];
for item in &list {
    list.push(*item + 1);
    println!("item = {}", item);
}

item是对list所拥有的记忆的引用;它的类型为&i32。您可以通过解除引用(*item)来读取该元素的值。

如果item调用要将向量的内存重新分配到其他地址,push中的引用会怎样?

然后,引用将包含地址。任何访问它的尝试都将涉及读取一些未定义的内存块。这违反了Rust的核心安全原则。

  

还没有Send / Sync

SendSync关注多个线程。从上面的示例中可以看出,您不需要线程来产生无效的引用。