38.借用与引用
/*
1.rust中借用和引用的附帶功效都一樣,就是都有生命周期。借用使用&關鍵字,引用使用ref關鍵字。借用的對象是必須存在的,引用的對象可以虛擬的,后期附上對象。
2.match的模式匹配上只能使用 ref,在函數聲明上只能使用&來表示引用類型
3.非要給區分ref和&到底哪個是引用,哪個是借用。我們可以先從詞性劃分,引用我歸類為名詞,而借用歸類為動詞。&A在表達式上 表示借用A,這是一個動作,那結果就是產出一個引用類型。所以let ref B表示聲明了一個引用類型,它只能綁定到某次借用動作上。所以ref 更適合叫引用, &叫借用。我們在不同情況下解釋&的意思:在表達式上,表示的是借用。在變量綁定上,表示解地址操作與*類似。在類型聲明上,表示引用類型。在模式匹配上,無效關鍵字那么ref的通用解釋是:在表達式上,無效關鍵字。在變量綁定上,表示引用類型。在類型聲明上,無效關鍵字。在模式匹配上,表示引用類型。https://www.jianshu.com/p/ac519d8c5ec9
https://www.cnblogs.com/chen8840/p/12699265.html
https://www.jianshu.com/p/7ac48c978624
*/#![feature(core_intrinsics)]fn print_type_name_of<T>(_: T) {println!("{}", unsafe { std::intrinsics::type_name::<T>() })
}fn test1() {let ref a1: i32;//a = 1; expected `&i32`, found integer help: consider borrowing here: `&1`a1 = &1;print_type_name_of(a1); //&i32let ref a2 = 1;print_type_name_of(a2); //&i32let ref a3 = &1;print_type_name_of(a3); //&&i32let c = 'Q';// 賦值語句中左邊的 `ref` 關鍵字等價于右邊的 `&` 符號。let ref ref_c1 = c;let ref_c2 = &c;println!("ref_c1 equals ref_c2: {}", *ref_c1 == *ref_c2);//& 與 * 的關系, 那么&用在綁定上是怎么樣的?其實&用在綁定上與*用在表達式上是一樣的:let r1 = &1;print_type_name_of(r1); //&i32let &r2 = r1;print_type_name_of(r2); //i32let r3 = *r1;print_type_name_of(r3); //i32
}fn test2() {fn f1(_s: &String) {println!("{:p}", _s);}fn f2(ref _s: String) {println!("{:p}", _s);}let s = String::from("hello");let sref1 = &s;let ref sref2 = s;println!("{:p}", sref1);println!("{:p}", sref2);f1(&s);f2(s);
}fn test3() {let x = &false;print_type_name_of(x);let &x = &false;print_type_name_of(x);let ref x = false;print_type_name_of(x);let ref x = &false;print_type_name_of(x);
}fn test4() {let os = Some(String::from("s"));match os {//Some(s) => { 如果這樣寫下面的打印信息將不可編譯 : value borrowed here after partial moveSome(ref s) => {print_type_name_of(s); //&alloc::string::String}_ => (),};println!("{:?}", os);let os = &Some(String::from("s"));match os {Some(s) => {print_type_name_of(s); //&alloc::string::String}_ => (),};
}fn main() {test1();test2();test3();test4();
}
?
總結
- 上一篇: 37.rust属性.txt
- 下一篇: 网络流媒体协议之——RTSP协议