我正在学习Rust的所有权。我的测试表明,在变量分配时,字符串字面值会被复制,而
String
实例会被移动。这是否意味着String
是Drop
类型,而字符串字面值是Copy
类型?
< p >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()
的最后一行,会出现value used here after move
的错误,原因是变量eric
已经被移动。