rust--as_ref和borrow的區(qū)別

// as_ref和Borrow的區(qū)別 ?

// as_ref 是轉引用函數, 將具有所有權對象轉換成引用對象,
// 不改變被轉換對象的基礎上產生一個引用對象.

// as_ref 并不是所有類型都默認支持, 很多時候都需要自己去聲明.
// as_ref 是AsRef trait 的公共接口方法.
// 只有那些實現(xiàn)了 as_ref 公共接口方法的類型才能使用as_ref.
// 目前: Option, Box, Result 這三種類型默認提供支持as_ref.

// as_ref 和 Borrow 的區(qū)別是:
// 基礎數據類型引用:
//     Borrow 可以直接在 int, &str, String, vec, [], struct, enum 這種類型上直接指定&來引用.
//     as_ref 則不行, 它需要聲明泛型T: AsRef<int>, T: AsRef<str>, T: AsRef<struct name> 來支持.
// 嵌套數據類型引用: Some(&int) , Box(&int) ,
//     Borrow 必須在定義結構時聲明 Some<&int> , Box<&int> 才是引用.
//     as_ref 則直接可以在這些嵌套結構上使用as_ref.
// 引用的引用
//     Borrow 引用的引用的表現(xiàn)形式是:   &str -> &&str
//     as_ref 引用的引用的表現(xiàn)形式是:   &str -> &str


fn borrow_example() {
    let s = 1;
    let x = &s;                                                                // 直接引用
    println!("s:{}; x: {}", s, x);
}


fn borrow_nest_example() {

    fn hello(x: Option<&i32>) -> Option<&i32> {                                          // 指定Some<&i32>
        match x {
            Some(_item) => x,
            None => None
        }
    }

    let s = 1234;
    let z = hello(Some(&s));                                                   // 傳入之前要先把引用聲明好.
    println!("s: {};  z: {:?}", s, z);
}


#[allow(dead_code)]
#[allow(unused_variables)]
fn borrow_reference_to_reference() {
    let a: &str = "str";
    let b: &&str = &a;
}


fn as_ref_example() {

    // as_ref 在這種場景的使用上不如 borrow,
    // 這是因為這種寫法要求把所有權轉移進來.
    // 又不能把&str 返回回去, 因為生命周期會沖突.
    // 所以as_ref不建議在這種場景下使用.

    fn hello<T: AsRef<str>>(x: T) {
        let xx = x.as_ref();
        println!("xx: {}", xx);
    }
    let s = String::from("hello");
    hello(s);
}


fn as_ref_nest_example() {

    // as_ref 非常適合這種場景, 簡單快捷.

    fn hello(x: Option<i32>) -> Option<i32> {
        x.as_ref();                                                            // Option<i32>  to  Option<&i32> 很方便后續(xù)代碼的編寫.
        x
    }

    let s = 1234;
    let z = hello(Some(s));
    println!("s: {}; z: {:?}", s, z);
}


fn as_ref_reference_to_reference() {
    #[allow(dead_code)]
    #[allow(unused_variables)]
    fn hello<T: AsRef<str>>(x: T) {
        let y: &str = x.as_ref();
        let z: &str = y.as_ref();                   // 引用上再引用, 永遠只有一層引用.
    }

    let s = "hello";
    hello(s);
}


fn main() {
    borrow_example();
    borrow_nest_example();
    borrow_reference_to_reference();
    as_ref_example();
    as_ref_nest_example();
    as_ref_reference_to_reference();
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末粹湃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子泉坐,更是在濱河造成了極大的恐慌为鳄,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坚冀,死亡現(xiàn)場離奇詭異济赎,居然都是意外死亡,警方通過查閱死者的電腦和手機记某,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來构捡,“玉大人液南,你說我怎么就攤上這事」椿眨” “怎么了滑凉?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喘帚。 經常有香客問我畅姊,道長,這世上最難降的妖魔是什么吹由? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任若未,我火速辦了婚禮,結果婚禮上倾鲫,老公的妹妹穿的比我還像新娘粗合。我一直安慰自己,他們只是感情好乌昔,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布隙疚。 她就那樣靜靜地躺著,像睡著了一般磕道。 火紅的嫁衣襯著肌膚如雪供屉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天溺蕉,我揣著相機與錄音伶丐,去河邊找鬼。 笑死焙贷,一個胖子當著我的面吹牛撵割,可吹牛的內容都是我干的。 我是一名探鬼主播辙芍,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼啡彬,長吁一口氣:“原來是場噩夢啊……” “哼羹与!你這毒婦竟也來了?” 一聲冷哼從身側響起庶灿,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤纵搁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后往踢,有當地人在樹林里發(fā)現(xiàn)了一具尸體腾誉,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年峻呕,在試婚紗的時候發(fā)現(xiàn)自己被綠了利职。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘦癌,死狀恐怖猪贪,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情讯私,我是刑警寧澤热押,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站斤寇,受9級特大地震影響桶癣,放射性物質發(fā)生泄漏。R本人自食惡果不足惜娘锁,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一牙寞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧致盟,春花似錦碎税、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杯道,卻和暖如春匪煌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背党巾。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工萎庭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人齿拂。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓驳规,卻偏偏與公主長得像,于是被迫代替她去往敵國和親署海。 傳聞我的和親對象是個殘疾皇子吗购,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容

  • 1.as (1)從派生類轉換成基類,(upcasts)向上轉換,即:子類向父類轉換. 定義一個父類People c...
    柚子皮膚閱讀 1,843評論 0 0
  • 1.as的使用場合 1.從派生類轉換為基類医男,向上轉類型(upcasting) 2.消除二義性,數值類型轉換 3.s...
    藍色的風閱讀 5,104評論 2 6
  • 快速原型制造 傳統(tǒng)零件設計受制造工藝影響不能做的很合理——新的CAD設計 RPW發(fā)展 3D打印 醫(yī)學應用
    defineaset閱讀 231評論 0 0
  • 我厭惡我周邊的人 在我看來 他們 愚昧捻勉,無知 熱愛吹噓镀梭,假模假樣 我對他們的唯一感覺 惡心 但 我對他們露出 羞澀...
    姜伯衡閱讀 169評論 0 1
  • 生活不易,難為自己踱启,實在可惜
    OO7344閱讀 87評論 0 0