在Rust的世界里,想要優雅地共享數據,就得聊聊“借用”這檔子事。想象一下,朋友有個寶貝,咱們不奪人所愛,只是暫時借用一下,用完還得物歸原主,這就是借用(Borrowing)的核心思想。
來看看這行代碼:
let y = &x;
這里,y就是一個指向x的引用,就像你跟朋友說:“嘿,借你那5塊錢瞅瞅。”要查看y指向的值,得用解引用運算符,就像這樣:
assert_eq!(5, *y);
就像借來的錢終究要還,引用離開作用域后,它指向的數據依然安好無恙。
比如,我們要計算字符串s1的長度,但又不想轉讓所有權,怎么辦?用引用傳參唄!
fn calculate_length(s: &String) -> usize { s.len()}
在main函數里,我們這么用:
let s1 = String::from("hello");let len = calculate_length(&s1);println!("The length of '{}' is {}.", s1, len);
瞧見沒,s1的引用被傳遞給了calculate_length函數,既測了長度,又沒動人家的奶酪,多和諧!
不過,要是想修改借用的東西,就像你不僅想牽牽手還想給妹子一個擁抱,那就得用可變引用了,得這么寫:
fn change(some_string: &mut String) { some_string.push_str(", world");}
記得,被借用的變量也得是可變的,就像這樣初始化:
let mut s = String::from("hello");change(&mut s);
這下,你的“hello”就能變成“hello, world”了。
但別太貪心,Rust規定,在同一時間,對于同一個數據,只能有一個可變引用存在。比如這段代碼就會報錯:
let mut s = String::from("hello");let r1 = &mut s;let r2 = &mut s; // 這里會報錯
為啥?因為Rust的borrow checker(借用檢查器)在盯著呢,它絕不允許數據競爭這種危險的事情發生,那可是軟件bug的大戶。
遇到借用沖突,別急,大括號是你的解藥。它能幫你控制變量的作用域,這樣就能巧妙避開借用檢查器的紅線:
{ let r1 = &mut s;} // r1的生命到此為止let r2 = &mut s; // 現在可以再創建一個可變引用了
怎么樣,是不是覺得Rust的借用機制既嚴格又貼心?這都是為了咱們程序的安全和穩定啊!
本文鏈接:http://www.tebozhan.com/showinfo-26-85712-0.html聊聊Rust中的“借用”
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 秒掛了!與快手無緣了....