【发布时间】:2017-11-17 15:22:43
【问题描述】:
我正在了解 Rust 的所有权。我的测试表明,在移动 String 实例时,会在变量赋值上复制字符串文字。这是否意味着String 是Drop 而字符串文字是Copy?
variable_assign_test.rs
// variable assign test,
// assign variable on stack to another,
fn test_stack_assign() {
let x = 5;
let y = x; // data duplicated on stack,
println!("x = {}, y = {}", x, y); // it's ok,
}
// assign variable on heap to another,
fn test_heap_assign() {
let s1 = String::from("hello");
let s2 = s1; // now s1 is invalid, should not use it any more,
// println!("{}", s1); // this won't compile,
println!("s2 = {}", s2); // it's ok,
}
fn test_tuple_assign() {
let pa = (1, 2);
let pb = pa;
println!("pa = {:?}, pb = {:?}", pa, pb); // it's ok,
// tuple that contains string literal,
let name_monica = "monica";
let monica = (11, name_monica);
let monica2 = monica;
println!("monica = {:?}, monica2 = {:?}", monica, monica2);
// tuple that contains String instance,
let name_eric = String::from("eric");
let eric = (12, name_eric);
let eric2 = eric; // eric is invalid now,
// println!("eric = {:?}, eric = {:?}", eric, eric2); // this won't compile,
}
fn main() {
test_stack_assign();
test_heap_assign();
test_tuple_assign();
}
使用rustc variable_assign_test.rs -o a.out 编译并使用./a.out 运行
如果test_tuple_assign() 的最后一行未注释,则会为变量eric 得到错误value used here after move。
【问题讨论】:
-
谢谢,我觉得你的问题比较容易理解:)