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

盛安安*_*盛安安 1 types type-systems pointers rust

是不是已经Send/ Sync?官方文件只提到它与数据竞赛有关.

She*_*ter 5

因为记忆安全.

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

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

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

item如果push调用将向量的内存重新分配给不同的地址,那么引用会发生什么?

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

还没有Send/Sync

SendSync关注多线程.从上面的示例中可以看出,您不需要线程来潜在地生成无效引用.