Rust基礎(chǔ)之變量恨统、元組叁扫、數(shù)據(jù)、函數(shù)畜埋、遮蔽莫绣、復(fù)制、可變引用悠鞍、不可變引用


fn main() {

? ? log("varible");

? ? let v_x:i32=5;

? ? let v_y:String="test".to_string();

? ? let v_z:char='a';

? ? let v_a:bool=true;

? ? let v_b:f64=3.14;

? ? const PI:f64=3.1415926;

? ? let v_t:bool=true;

? ? println!("int:{v_x},str:{v_y},char:{v_z},bool:{v_a},float:{v_b},const:{PI},bool:{v_t}");

? ? log("shawdowing");

? ? let s_x=5;

? ? {

? ? ? ? let s_x:i32=s_x*2;

? ? ? ? //作用域內(nèi)的x值只在作用域內(nèi)生效对室,會遮蔽作用域外的x,當該作用域結(jié)束,域內(nèi)的x被使用掩宜,遮蔽結(jié)束

? ? ? ? println!("shadowing x:{s_x}");

? ? }

? ? println!{"actual x:{s_x}"}

? ? //元組用于存放類型不一致的一組數(shù)據(jù)蔫骂,使用.操作符訪問元組成員,也可使用解構(gòu)函數(shù)訪問元組成員牺汤;數(shù)組用于存放一組類型一致的數(shù)據(jù)纠吴,使用下標訪問數(shù)組元素

? ? log("tuple array");

? ? let tup:(i32,f64,bool)=(3,3.14,true);

? ? let (t1,t2,t3)=tup;

? ? let arr=[1,2,3,4,5];

? ? let arr1:[i32;5]=[1,2,3,4,5];

? ? println!("tup.0:{},t1:{},t2:{},t3:{},arr[0]:{},arr1[0]:{}",tup.0,t1,t2,t3,arr[0],arr1[0]);

? ? //函數(shù)與其他編程語言類似

? ? log("function");

? ? println!("add:{}",add(3,5));

? ? let ?f_x=5;

? ? println!("x before function:{}",f_x) ;

? ? change_number(f_x);

? ? println!("x after function:{}",f_x) ;

? ? let f_s:String=String::from("string ");

? ? println!("str before function:{}",f_s) ;

? ? //實參如果是string類型,必須傳入String的復(fù)制體慧瘤,因為String不能自動復(fù)制戴已,會發(fā)生所有權(quán)轉(zhuǎn)移,傳入函數(shù)后锅减,原變量會失效

? ? change_str(f_s.clone());

? ? //若上一句不傳入clone()復(fù)制體糖儡,以下語句將報錯。

? ? println!("{f_s}"); ?

? ? // rust中每一個值都擁有一個所有者

? ? // 每一個個值在任意一個時刻有且只能有一個所有者

? ? // 當值的所有者離開作用域怔匣,該值將會被丟棄握联,內(nèi)存會被回收

? ? //copy

? ? log("copy");

? ? let c_x=5;

? ? let c_y=c_x;

? ? println!("x:{},y:{}",c_x,c_y);

? ? // move

? ? log("move");

? ? let c_str:String=String::from("Move String");

? ? let c_str1=c_str;

? ? //println!("c_str:{}",c_str); c_str會被丟棄,因為指向該字符串值的指針已被轉(zhuǎn)移至c_str1

? ? println!("c_str1:{}",c_str1);

? ? // 當你復(fù)制一個字符串字面量時每瞒,原字符串字面量仍然可用金闽,因為字符串字面量是存儲在棧上的大小已知的數(shù)據(jù)類型,與整形等類似剿骨,復(fù)制棧數(shù)據(jù)并不會消耗資源代芜,唯一的缺點是不可變

? ? log("copy &str");

? ? let c_stra="c_stra";

? ? let ?c_strb=c_stra;

? ? println!("c_stra:{c_stra}");

? ? println!("c_strb:{c_strb}");

? ? log("copy String");

? ? // 當你將一個字符串變量賦值給一個新的變量時,該字符串變量會失效浓利,因為其是存儲在堆上

? ? //復(fù)制該變量會將保存變量指針的地址轉(zhuǎn)移至新變量挤庇,為確保不會發(fā)生二次釋放,舊變量必須失效贷掖,除非使用clone生成一個該變量的深復(fù)制嫡秕,唯一的缺點是clone相當消耗資源岸浑。

? ? {

? ? ? ? let str=String::from("owner_ship");

? ? ? ? let str1=str;

? ? ? ? //println!("{o_str}"); 這里不能使用o_str1 因為其所有權(quán)被轉(zhuǎn)移甚牲,已失效

? ? ? ? println!("o_str1:{str1}");

? ? }

? ? log("reference");

? ? {

? ? ? ? //對各類變量的操作將會導(dǎo)致大量的所有權(quán)轉(zhuǎn)移和變更袁稽,比較繁瑣

? ? ? ? let r_str:String=String::from("Move String");

? ? ? ? //println!("r_str:{}",r_str); 該語句將報錯吮螺,因為下一句已經(jīng)將r_str所有權(quán)轉(zhuǎn)移至calc_len函數(shù)內(nèi)灾螃,r_str將被丟棄

? ? ? ? let (s,l)=calc_len(r_str);

? ? ? ? println!("r_str:{},length:{}",s,l);

? ? }

? ? //引用牵敷, 在不獲得所有權(quán)的情況下使用數(shù)據(jù)向拆,分為可變引用和不可變引用

? ? {

? ? ? ? //不可變引用罪既,一個作用域內(nèi)可以同時存在一個變量的多個不可變引用腹暖,不會有額外性能開銷

? ? ? ? //以上計算字符串長度的函數(shù)可以在不獲取原字符串所有權(quán)的前提下汇在,使用引用實現(xiàn)

? ? ? ? let r_str:String=String::from("unmutable Reference String ");

? ? ? ? let l=calc_len_by_reference(&r_str);

? ? ? ? println!("length of r_str1:{}",l);

? ? }

? ? {

? ? ? ? //一個作用域內(nèi)可存在多個不可變引用,因為不可變引用沒有所有權(quán)脏答,不會發(fā)生數(shù)據(jù)競爭

? ? ? ? let r_str:String=String::from("unmutable Reference String ");

? ? ? ? let r_str1:&String=&r_str;

? ? ? ? let r_str2:&String=&r_str;

? ? ? ? let r_str3:&String=&r_str;

? ? ? ? println!("r_str:{},r_str1:{},r_str2:{},r_str3:{}",r_str,r_str1,r_str2,r_str3);

? ? ? ? //不可變引用的缺點是所有的引用都不可變糕殉,因為不可變引用不具有所有權(quán)

? ? ? ? //取消注釋以下代碼將報錯

? ? ? ? //r_str3.push_str("string");

? ? }

? ? {

? ? ? ? //可變引用亩鬼,可以使用可變引用去改變一個變量

? ? ? ? let mut r_str:String=String::from("mutable Reference String ");

? ? ? ? println!("可變引用改變前的r_str2:{}",r_str);

? ? ? ? change_str_by_mut_reference(&mut r_str);

? ? ? ? println!("可變引用改變后的r_str2:{}",r_str);

? ? }

? ? {

? ? ? ? //一個作用域內(nèi)僅可擁有一個可變引用,同時存在多個可變引用將會引起數(shù)據(jù)競爭或引發(fā)內(nèi)存污染

? ? ? ? let mut r_str:String=String::from("mutable Reference String");

? ? ? ? let _r_str1: &mut String=&mut r_str;

? ? ? ? //取消注釋以下代碼將報錯

? ? ? ? //let _r_str2: &mut String=&mut r_str2;

? ? ? ? //println!("length of r_str1:{},{}",_r_str1,_r_str2);

? ? }

? ? {

? ? ? ? //一個作用域內(nèi)不能同時存在可變引用和不可變引用

? ? ? ? let mut _r_str:String=String::from("mutable Reference String");

? ? ? ? let _r_str1: &mut String=&mut _r_str;

? ? ? ? //取消注釋以下代碼將報錯,因為已存在不可變引用阿蝶,不可以創(chuàng)建可變引用雳锋,因為一個作用域內(nèi)任何不可變引用存在時,其所有者都不希望該引用的值發(fā)生變化

? ? ? ? //let _r_str2: &String=&_r_str;

? ? ? ? //println!("{}, {}", _r_str1, _r_str2);

? ? ? ? //在不同的作用域內(nèi)可以存在多個對一個變量的可變引用

? ? ? ? {

? ? ? ? ? ? let _r_str3: &mut String=&mut _r_str;

? ? ? ? ? ? println!("mutable reference _r_str3:{}", _r_str3);

? ? ? ? }

? ? }

? ? log("懸垂引用 dangling pointer");

? ? {

? ? ? ? //取消注釋以下語句將會報錯羡洁,因為函數(shù)內(nèi)返回str 的引用玷过,但函數(shù)結(jié)束時,函數(shù)內(nèi)的str被釋放筑煮,返回的引用變成懸垂引用辛蚊,

? ? ? ? //let str=dangle();

? ? ? ? //fn dangle()->&String{

? ? ? ? ? ? //let str=String::from("dangling string");

? ? ? ? ? ? //&str

? ? ? ?// }

? ? }

? ? {

? ? ? ? //避險懸垂引用的辦法時直接返回變量,是變量所有權(quán)轉(zhuǎn)移至函數(shù)外變量

? ? ? ? let _str=dangle1();

? ? }

}

fn dangle1()->String{

? ? let str=String::from("dangling string");

? ? str

}

fn calc_len(s:String)->(String,usize){

? ? let l: usize=s.len();

? ? return (s,l);

}

fn calc_len_by_reference(s:&String)->usize{

? ? s.len()

}

fn change_str_by_mut_reference( s: &mut String){

? ? s.push_str("muteed");

}

fn add(x:i32,y:i32)->i32{

? ? x+y

}

fn change_number(mut i:i32){

? ? i=i+1;

? ? println!("x in function:{}",i) ;

}

fn change_str(mut s:String){

? ? s.push_str("pushed");

? ? println!("str in function:{}",s) ;

}

fn log(s:&str){

? ? println!("################## {s} ##################");

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末真仲,一起剝皮案震驚了整個濱河市袋马,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秸应,老刑警劉巖虑凛,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異软啼,居然都是意外死亡桑谍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門祸挪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锣披,“玉大人,你說我怎么就攤上這事匕积∮蓿” “怎么了榜跌?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵闪唆,是天一觀的道長。 經(jīng)常有香客問我钓葫,道長悄蕾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任础浮,我火速辦了婚禮帆调,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豆同。我一直安慰自己番刊,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布影锈。 她就那樣靜靜地躺著芹务,像睡著了一般蝉绷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枣抱,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天熔吗,我揣著相機與錄音,去河邊找鬼佳晶。 笑死桅狠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的轿秧。 我是一名探鬼主播中跌,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼菇篡!你這毒婦竟也來了晒他?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤逸贾,失蹤者是張志新(化名)和其女友劉穎陨仅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铝侵,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡灼伤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咪鲜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狐赡。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疟丙,靈堂內(nèi)的尸體忽然破棺而出颖侄,到底是詐尸還是另有隱情,我是刑警寧澤享郊,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布览祖,位于F島的核電站,受9級特大地震影響炊琉,放射性物質(zhì)發(fā)生泄漏展蒂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一苔咪、第九天 我趴在偏房一處隱蔽的房頂上張望锰悼。 院中可真熱鬧,春花似錦团赏、人聲如沸箕般。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丝里。三九已至可柿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丙者,已是汗流浹背复斥。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留械媒,地道東北人目锭。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像纷捞,于是被迫代替她去往敵國和親痢虹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容