我写了下面这行代码:
fn main() {
let mut s = vec!["my".to_string(), "here".to_string(), "babe".to_string()];
let t = s;
s = vec!["three".to_string()];
let u = s;
}
基于我对 rust 编译器行为和 rust 所有权规则的理解,在我将
s
值的所有权(它不是原始类型,并且不实现 COPY 特征,因为它是 Vec 类型)移至 后t
在第2行中,我不应该能够更改s
的值,因为这个变量(我的意思是s
)不再有效!但这行代码完全有效。谁能解释一下为什么吗?
我希望通过运行此代码来面对编译器错误!
你关于在some范围内无法
read
s
的说法是正确的,因为vec!["my", "here", "babe"]
(为了简化而省略了to_string
)移入了t
并且向量不是Copy
。然而,在 Rust 中,如果你重新分配一些向量给它,你就可以再次读取(或写入)s
(是的,它也可以移出到某个地方)。
从技术上讲,它与以下代码等效,并且工作正常:
let mut s = vec!["my".to_string(), "here".to_string(), "babe".to_string()];
let t = s;
let s2 = vec!["three".to_string()];
let u = s2;