直接上代码,有点基础的都能看懂。
fn main() {
let stack_para = 1;
let heap_para1: String = String::from("heap_para1");
take_owner(stack_para.to_string());
take_owner(stack_para.to_string()); //因为stack_para在stack上,所以函数参数采用值拷贝,不存在所有权问题
take_owner(heap_para1); //因为heap_para在heap上,所以heap_para的所有权转交函数参数,故不能再次使用
//take_owner(heap_para); //再次调用会出错
let mut heap_para2: String = String::from("heap_para2");
change_ref(&mut heap_para2); //对于在heap上的变量采用reference的方式,参数引用是不持有所有权的。
change_ref(&mut heap_para2); //再次调用没有问题
//
let mut stack_para1 = 1;
for i in 1..10 {
let sub = stack_para1;
stack_para1 += sub; //此处sub虽然是临时stack变量,但因为是值操作,stack_para1的值已计算完成,不存在所有权问题。
}
println!("statck_para1={}", stack_para1);
let heap_para3 = String::from("heap_para3"); //大括号内sub获取的是reference,所以没有获得所有权
{
let sub = &heap_para3;
println!("sub value={}", sub);
}
println!("statck_para3={}", heap_para3); //此处打印正常
{
//大括号内sub获得所有权
let sub = heap_para3;
println!("sub value={}", sub);
}
//println!("statck_para3={}",heap_para3);//此处已报错,borrow of moved value
}
fn take_owner(str: String) {
println!("{}", str);
}
fn change_ref(str: &mut String) {
str.push_str(" add by ref");
println!("{}", str);
}
下面是输出
1
1
heap_para1
heap_para2 add by ref
heap_para2 add by ref add by ref
statck_para1=512
sub value=heap_para3
statck_para3=heap_para3
sub value=heap_para3
好了就是这样。