Rust 屬性是什麼?

yunyi發表於2020-09-26


最近,在同事的推薦下,試了一下RUST。總體來說,非常優秀,特別是所有權模型。在手動記憶體管理與垃圾回收之間,開闢了一條新道路——編譯階段自動判斷釋放記憶體。

從一段程式碼說起

當看到RUST屬性一節時,遇到了麻煩。RUST屬性給人的感覺是很多,很亂,很雜,看得腦殼疼。於是先放著,過了兩天在回看。

我是在練習activ Web框架時遇到屬性,請看如下程式碼:

//定義路由,繫結函式
#[get("/")]
async fn hello() -> impl Responder {
    HttpResponse::Ok().body("Hello world!")
}

// activ 框架內定義的函式
#[proc_macro_attribute]
pub fn get(args: TokenStream, input: TokenStream) -> TokenStream {
    route::generate(args, input, route::GuardType::Get)
}

這段程式碼出現了兩個屬性,分別代表什麼意思呢?#[proc_macro_attribute]屬性,用於表示函式get是一個過程巨集,即用於生成函式的巨集。巨集引數args對應#[get("/")]"/",巨集引數input對應整個hello。也就是說,輸入hello函式和其上的#[get("/")],輸出新函式。

屬性是什麼?

屬性是什麼?在程式語言中,屬性一定是物件的屬性。也就是說,必須先有物件,再談屬性。如果沒有物件,那就變成了空談屬性。如同不談資料結構,只談演算法一樣。

如果你是前端,應該非常熟悉屬性。比如<div style="color: red">,一個divDOM物件,該物件擁有一個屬性style。瀏覽器能將該物件,及其屬性,解析並顯示。在RUST,什麼被定義為物件呢?Crate、mod、fn、macro、struct等。屬性一定伴隨物件左右,在RUST中,表現為:

#[get("/")] //這是屬性
async fn hello() -> impl Responder { // 這是物件
    HttpResponse::Ok().body("Hello world!")
}

#[attribute] //這是屬性
struct Person{ // 這是物件
    name: String,
    age: 1
}

當給物件加上屬性之後,編譯器便可以對物件進行處理。最簡單的演算法是:判斷物件有無該屬性,若有,進行特殊處理。

其他語言有屬性概念嗎?

具我所知,肯定有。熟悉C#的人,認為屬性概念來自C#。而熟悉Java的人,會說:“屬性不就是Java中的註解嗎?”確實是的,語法功能相同。

最好類比理解,還是來自前端HTMLHTML屬性及其豐富,不僅有描述屬性,還有事件屬性。前者定義物件的大小樣式、能否編輯等,後者定義點選物件觸發事件。

小結

談屬性的前提,是先談物件。確定了物件,再確定物件有什麼屬性?能對物件執行什麼操作?這點,RUST官方文件,沒有寫好。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章