最近,在同事的推薦下,試了一下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">
,一個div
DOM物件,該物件擁有一個屬性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中的註解嗎?”確實是的,語法功能相同。
最好類比理解,還是來自前端HTML
。HTML
屬性及其豐富,不僅有描述屬性,還有事件屬性。前者定義物件的大小樣式、能否編輯等,後者定義點選物件觸發事件。
小結
談屬性的前提,是先談物件。確定了物件,再確定物件有什麼屬性?能對物件執行什麼操作?這點,RUST
官方文件,沒有寫好。
本作品採用《CC 協議》,轉載必須註明作者和本文連結