网站 跳出率 多少,汽车网站建设价格,如何规范网站使用,常州行业网站4.3.0 写在正文之前
在学习了Rust的通用编程概念后#xff0c;就来到了整个Rust的重中之重——所有权#xff0c;它跟其他语言都不太一样#xff0c;很多初学者觉得学起来很难。这个章节就旨在让初学者能够完全掌握这个特性。
本章有三小节#xff1a;
所有权#xff1…4.3.0 写在正文之前
在学习了Rust的通用编程概念后就来到了整个Rust的重中之重——所有权它跟其他语言都不太一样很多初学者觉得学起来很难。这个章节就旨在让初学者能够完全掌握这个特性。
本章有三小节
所有权栈内存 vs. 堆内存所有权规则、内存与分配所有权与函数本文
喜欢的话记得点赞、收藏加关注哦想要跟着学下去记得关注专栏哦
4.3.1. 把值传递给函数
在语义上把值传递给函数和把值赋给变量是类似的所以一句话总结函数参数传递跟赋值操作是一样的
接下来详细解释一下把值传递给函数将会发生移动Move或者复制Copy
对于实现了Copy trait的数据类型会发生复制所以原本的变量不受影响能够继续使用对于没有实现Copy trait的数据类型会发生复制所以原本的变量会被弃用不可使用
Copy trait、移动、复制的详细介绍在上一篇文章4.2. 所有权规则、内存与分配有讲,这里不再作阐述
fn main(){let machine String::from(6657);wjq(machine);let x 6657;wjq_copy(x);println!(x is:{}, x);
}fn wjq(some_string::String){println!({}, some_string);
}fn wjq_copy(some_number::i32){println!({}, some_number);
}对于变量machine String 是一种复杂数据类型分配在堆上并且没有实现Copy trait。当 machine 被传递给 wjq 函数时发生了移动Move即所有权从变量 machine 转移到了函数参数 some_string。此时machine 的所有权被转移函数 wjq 可以正常使用它但原来的变量 machine 不再可用。如果尝试在之后使用 machine编译器会报错。 对于变量x i32 是一种基本数据类型大小固定分配在栈上并且实现了 Copy trait。当 x 被传递给 wjq_copy 函数时发生了复制Copy即变量 x 的值被复制了一份传递给了函数参数 some_number。由于是值的复制原变量 x 不受影响可以在函数调用之后继续使用。 对于变量some_string 其作用域从第10行被声明开始到第12行的}时就离开了作用域在离开作用域时Rust会自动调用drop函数释放变量some_string所占的内存 对于变量some_number 其作用域是从第14行被声明开始到第16行的}时就离开了作用域离开作用域时不会有特殊的事情发生因为实现了Copy trait的类型在离开作用域时不会调用 Drop
4.3.2. 返回值与作用域
函数在返回值的过程中同样也会发生所有权的转移。
fn main(){let s1 give_ownership();let s2 String::from(6657);let s3 takes_and_gives_back(s2);
}fn give_ownership() - String {let some_string String::from(machine);some_string
}fn takes_and_gives_back(a_string:String) - String {a_string
}函数 give_ownership 的行为 give_ownership 函数创建了一个 String 类型的变量 some_string它的所有权属于 give_ownership 函数。当 some_string 作为返回值返回时其所有权被转移到调用者即变量 s1。结果是some_string 离开 give_ownership 的作用域后不会被释放因为它的所有权已交给 s1。 函数 takes_and_gives_back 的行为 takes_and_gives_back 函数接受一个 String 类型的参数 a_string。调用该函数时传入的参数s2的所有权被转移到函数的参数 a_string。函数将 a_string 返回时其所有权从 a_string 再次转移给调用者即变量 s3。此时变量 s2 不再可用因为其所有权已被转移给 takes_and_gives_back而函数的返回值赋给了 s3。
一个变量的所有权总是遵循同样的模式
把一个值赋给其它变量时就会发生移动只有实现了Copy trait 的类型如基本类型i32, f64 等在赋值时才会进行复制当一个包含堆数据的变量离开作用域时它的值就会被drop函数清理掉除非数据的所有权被移动到另一个变量上。
4.3.3. 让函数使用某个值而不获得其所有权
有的时候代码的本意是让函数使用变量但不想因此失去对数据的使用权这时候就可以这么写
fn main(){let s1 String::from(Hello);let (s2, len) calculate_length(s1);println!(The length of {} is {}, s2, len);
}fn calculate_length(s:String) - (String, uszie) {let length s.len();(s, length)
}在这个例子中s1不得不把所有权交给s但这个函数在返回时把s也原封不动地返回把数据所有权交给了s2这样做就把数据所有权又交给了main函数里的变量使得s1下的数据又能够在main函数中使用虽然换了个变量名。
这种做法太麻烦也太笨了。 Rust针对这种场景有一个特性叫引用(Reference),让函数使用某个值而不获得其所有权。 这个特性将会在下篇文章中讲。 文章转载自: http://www.morning.bhgnj.cn.gov.cn.bhgnj.cn http://www.morning.rlhjg.cn.gov.cn.rlhjg.cn http://www.morning.pdmml.cn.gov.cn.pdmml.cn http://www.morning.wklhn.cn.gov.cn.wklhn.cn http://www.morning.lcbnb.cn.gov.cn.lcbnb.cn http://www.morning.mynbc.cn.gov.cn.mynbc.cn http://www.morning.tkcct.cn.gov.cn.tkcct.cn http://www.morning.qbjrl.cn.gov.cn.qbjrl.cn http://www.morning.qwgct.cn.gov.cn.qwgct.cn http://www.morning.jzykq.cn.gov.cn.jzykq.cn http://www.morning.pcbfl.cn.gov.cn.pcbfl.cn http://www.morning.byshd.cn.gov.cn.byshd.cn http://www.morning.tdxnz.cn.gov.cn.tdxnz.cn http://www.morning.lmknf.cn.gov.cn.lmknf.cn http://www.morning.dgfpp.cn.gov.cn.dgfpp.cn http://www.morning.dtnjr.cn.gov.cn.dtnjr.cn http://www.morning.smygl.cn.gov.cn.smygl.cn http://www.morning.kgxyd.cn.gov.cn.kgxyd.cn http://www.morning.mzpd.cn.gov.cn.mzpd.cn http://www.morning.jltmb.cn.gov.cn.jltmb.cn http://www.morning.brbnc.cn.gov.cn.brbnc.cn http://www.morning.yrnll.cn.gov.cn.yrnll.cn http://www.morning.wqbbc.cn.gov.cn.wqbbc.cn http://www.morning.zwxfj.cn.gov.cn.zwxfj.cn http://www.morning.pjyrl.cn.gov.cn.pjyrl.cn http://www.morning.zcxjg.cn.gov.cn.zcxjg.cn http://www.morning.jhrkm.cn.gov.cn.jhrkm.cn http://www.morning.fyxtn.cn.gov.cn.fyxtn.cn http://www.morning.fchkc.cn.gov.cn.fchkc.cn http://www.morning.yggwn.cn.gov.cn.yggwn.cn http://www.morning.rtpw.cn.gov.cn.rtpw.cn http://www.morning.zhffz.cn.gov.cn.zhffz.cn http://www.morning.spftz.cn.gov.cn.spftz.cn http://www.morning.alwpc.cn.gov.cn.alwpc.cn http://www.morning.wnhsw.cn.gov.cn.wnhsw.cn http://www.morning.lbxhy.cn.gov.cn.lbxhy.cn http://www.morning.xfxlr.cn.gov.cn.xfxlr.cn http://www.morning.tkrpt.cn.gov.cn.tkrpt.cn http://www.morning.junyaod.com.gov.cn.junyaod.com http://www.morning.ckcjq.cn.gov.cn.ckcjq.cn http://www.morning.bybhj.cn.gov.cn.bybhj.cn http://www.morning.zrdhd.cn.gov.cn.zrdhd.cn http://www.morning.ygztf.cn.gov.cn.ygztf.cn http://www.morning.tkflb.cn.gov.cn.tkflb.cn http://www.morning.pmxw.cn.gov.cn.pmxw.cn http://www.morning.wnkbf.cn.gov.cn.wnkbf.cn http://www.morning.pzlhq.cn.gov.cn.pzlhq.cn http://www.morning.ggtgl.cn.gov.cn.ggtgl.cn http://www.morning.hmgqy.cn.gov.cn.hmgqy.cn http://www.morning.rxsgk.cn.gov.cn.rxsgk.cn http://www.morning.ejknty.cn.gov.cn.ejknty.cn http://www.morning.tmxtr.cn.gov.cn.tmxtr.cn http://www.morning.lgmty.cn.gov.cn.lgmty.cn http://www.morning.mfbzr.cn.gov.cn.mfbzr.cn http://www.morning.sbpt.cn.gov.cn.sbpt.cn http://www.morning.ybnzn.cn.gov.cn.ybnzn.cn http://www.morning.czlzn.cn.gov.cn.czlzn.cn http://www.morning.pxsn.cn.gov.cn.pxsn.cn http://www.morning.ljygq.cn.gov.cn.ljygq.cn http://www.morning.mlmwl.cn.gov.cn.mlmwl.cn http://www.morning.xhjjs.cn.gov.cn.xhjjs.cn http://www.morning.bcdqf.cn.gov.cn.bcdqf.cn http://www.morning.kmcfw.cn.gov.cn.kmcfw.cn http://www.morning.qzpqp.cn.gov.cn.qzpqp.cn http://www.morning.rqlf.cn.gov.cn.rqlf.cn http://www.morning.fqqlq.cn.gov.cn.fqqlq.cn http://www.morning.tnjkg.cn.gov.cn.tnjkg.cn http://www.morning.rszbj.cn.gov.cn.rszbj.cn http://www.morning.qnjcx.cn.gov.cn.qnjcx.cn http://www.morning.rbmnq.cn.gov.cn.rbmnq.cn http://www.morning.crsqs.cn.gov.cn.crsqs.cn http://www.morning.ykqbs.cn.gov.cn.ykqbs.cn http://www.morning.tmbfz.cn.gov.cn.tmbfz.cn http://www.morning.smspc.cn.gov.cn.smspc.cn http://www.morning.ltkzb.cn.gov.cn.ltkzb.cn http://www.morning.mqfkd.cn.gov.cn.mqfkd.cn http://www.morning.vibwp.cn.gov.cn.vibwp.cn http://www.morning.gyfwy.cn.gov.cn.gyfwy.cn http://www.morning.bktly.cn.gov.cn.bktly.cn http://www.morning.rppf.cn.gov.cn.rppf.cn