日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

rust 案例_理解Rust的引用与借用

發(fā)布時間:2025/4/16 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 rust 案例_理解Rust的引用与借用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

困惑

接觸Rust也一段時間了,但對References(引用) 、borrowing(借用) 、 &關(guān)鍵字、ref關(guān)鍵字、* 關(guān)鍵字,這幾個詞非常困惑。常見的問題不在乎下面幾條:

&關(guān)鍵字是代表引用還是借用?

ref 和 & 有什么區(qū)別?

總是與c++的引用對比,他們意思相同?(因為人在學(xué)習(xí)中總與現(xiàn)有的知識對比,所以有了這一條)

網(wǎng)上有很多對Rust中引用和借用部分進(jìn)行翻譯和解釋。看得真是云里霧里,一會說借用,一會說引用,那到底是引用還是借用?

現(xiàn)象

rust中借用和引用的附帶功效都一樣,就是都有生命周期。借用使用&關(guān)鍵字,引用使用ref關(guān)鍵字。借用的對象是必須存在的,引用的對象可以虛擬的,后期附上對象。

我看這網(wǎng)上的一段解釋,Rust的引用和c++ 語言的引用完全不一樣啊,c++ 語言說的是,引用類似變量別名,聲明引用時,必須同時對其進(jìn)行初始化。

引用的聲明方法:類型標(biāo)識符 &引用名=目標(biāo)變量名

再看下出自《Programming Rust Fast, Safe Systems Development》

in Rust terminology, we say that it borrows a reference to x. Given a

reference r, the expression *r refers to the value r points to. These are very much like

the & and * operators in C and C++

Unlike C pointers, however, Rust references are never null: there is simply no way to

produce a null reference in safe Rust. And Rust references are immutable by default:

這怎么拿Rust引用與C++的指針進(jìn)行比較了。都不知道那種是更合理的解釋。

實踐

實踐出真知,還是動動手。

首先證明的是引用是否可以為空。

let ref a:i32;

//a = 1; // expected &i32,consider borrowing here: `&1`

a = &1;

上面代碼能編譯通過,這說明Rust中的引用和c++ 中的引用不是一個意思,更像c++ 中的指針類型。c++ 通過int *a來聲明指針類型。

ref 與 & 的區(qū)別

let ref a=2;

let a = &2;

兩個值都是&i32類型。

所以ref用在變量綁定與&用在表達(dá)式上是一樣的效果。

看到上一個例子的錯誤提示,consider borrowing here,那么&在Rust的表達(dá)式上可以看成是借用,這與c++ 取地址符是一個意思。

struct B {

pub a: &'l u32,

// pub b: ref u32, expected type, found keyword `ref`

}

let ref a = &1;

let b = B{ a: a };

在類型聲明上,&表示引用類型。

& 與 * 的關(guān)系

那么&用在綁定上是怎么樣的?其實&用在綁定上與*用在表達(dá)式上是一樣的:

let r=&1;

let &a=r;

let a=*r;

兩個值都是i32類型。

如果上面的解釋還沒有讓你明白他們之間的關(guān)系,那么通過代碼直接輸出具體類型,這能加深理解。

#![feature(core_intrinsics)]

fn main() {

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);

}

fn print_type_name_of(_: T) {

println!("{}", unsafe { std::intrinsics::type_name::() })

}

&bool

bool

&&bool

例子:

#![feature(core_intrinsics)]

enum Favour {

Nor(u32),

NorRef(u32),

Ref(&'a u32),

RefRef(&'a u32),

}

fn config(data: &u32) {

println!("log data: {}", data);

}

// fn con(data: ref u32){ //expected type, found keyword `ref`

// println!("log data: {}", data);

// }

fn log(fav: Favour) {

match fav {

Favour::Nor(data) => {

config(&data);

print_type_name_of(data);

},

Favour::NorRef(ref data) => {

config(data);

print_type_name_of(data);

},

Favour::Ref(data) => {

config(data);

print_type_name_of(data);

},

Favour::RefRef(ref data) => {

config(data);

print_type_name_of(data);

}

}

}

fn print_type_name_of(_: T) {

println!("{}", unsafe { std::intrinsics::type_name::() })

}

fn main() {

log(Favour::Nor(1));

log(Favour::Ref(&2));

log(Favour::NorRef(3));

log(Favour::RefRef(&4));

}

log data: 1

u32

log data: 2

&u32

log data: 3

&u32

log data: 4

&&u32

match的模式匹配上只能使用 ref,在函數(shù)聲明上只能使用&來表示引用類型

總結(jié)

單純Rust語言上考慮。

我們在不同情況下解釋&的意思:

在表達(dá)式上,表示的是借用。

在變量綁定上,表示解地址操作與*類似。

在類型聲明上,表示引用類型。

在模式匹配上,無效關(guān)鍵字

那么ref的通用解釋是:

在表達(dá)式上,無效關(guān)鍵字。

在變量綁定上,表示引用類型。

在類型聲明上,無效關(guān)鍵字。

在模式匹配上,表示引用類型。

非要給區(qū)分ref和&到底哪個是引用,哪個是借用。我們可以先從詞性劃分,引用我歸類為名詞,而借用歸類為動詞。&A在表達(dá)式上 表示借用A,這是一個動作,那結(jié)果就是產(chǎn)出一個引用類型。所以let ref B表示聲明了一個引用類型,它只能綁定到某次借用動作上。

所以ref 更適合叫引用, &叫借用。

參考:

總結(jié)

以上是生活随笔為你收集整理的rust 案例_理解Rust的引用与借用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。