Rust編程語言做了哪些正確的設計据块?

Rust編程語言目前勢頭很猛,受到了幾大互聯網巨頭的青睞冒滩,比如谷歌浪谴、微軟因苹、Meta篇恒,亞馬遜等,還作為第二語言進入了Linux內核款筑,國內的華為和字節(jié)跳動等公司也有Rust相關的應用腾么。

本人是一個Rust的粉絲,寫過不少的Rust應用解虱,這里我總結一下我認為的Rust相比于其他編程語言的更為正確的設計:

Sum type

Sum type是比較學術的說法,常見于函數式語言于宙,但是sum type并非函數式語言的專屬悍汛,老大哥C語言的union加上tag之后就是sum type(俗稱tagged union),而動態(tài)類型語言的變量的類型其實就是封裝出來的sum type類型谱俭,比如PHP的變量定義:

typedef union _zend_value {
    zend_long         lval;             /* long value */
    double            dval;             /* double value */
    zend_refcounted  *counted;
    zend_string      *str;
    zend_array       *arr;
    zend_object      *obj;
    zend_resource    *res;
    zend_reference   *ref;
    zend_ast_ref     *ast;
    zval             *zv;
    void             *ptr;
    zend_class_entry *ce;
    zend_function    *func;
    struct {
        uint32_t w1;
        uint32_t w2;
    } ww;
} zend_value;

但是為啥某些主流的靜態(tài)類型語言卻缺失了這個概念(比如Java宵蛀、Go等)?我是沒想明白的糖埋,畢竟老大哥C語言都有這個概念了,缺失了sum type會導致某些需要動態(tài)的場景非常的別扭征候,比如序列化JSON祟敛,舉個例子,需要反序列化如下的JSON:

[1, "foo", null]

Java要怎么做跑揉?只能序列化到List<Object>,然后靠類型推斷來判斷是Integer還是String還是Object(null)了历谍,這樣就喪失掉靜態(tài)類型的優(yōu)勢了。

而Rust的sum type關鍵字enum就很好地解決了這個問題印蔬,serde_json庫的Value就已經完美地定義了JSON的結構:

pub enum Value {
    Null,
    Bool(bool),
    Number(Number),
    String(String),
    Array(Vec<Value>),
    Object(Map<String, Value>),
}

沒有null

這是個老生常談的問題侥猬,null的發(fā)明者Tony Hoare將null的設計稱為十億美元錯誤,意思是null造成的無法計數的錯誤退唠、漏洞和系統(tǒng)崩潰可能已經造成了十億美元的損失荤胁。

而Rust的解決方式是通過sum type,即Option松蒜,來強制用戶必須處理null的情況:

pub enum Option<T> {
    None,
    Some(T),
}

在其他一些沒有sum type語言中也有類似的做法扔茅,比如dart的null safety符號?,java的Optional(可惜出來得太晚也不是強制性的)召娜。

賦值默認是移動語義

這個是我認為非常正確的設計,普遍的編程語言的賦值都是復制語義秸讹,對于像bool雅倒、int、指針之類的基本類型蔑匣,復制成本低,因此復制語義對于他們來說比較合適凿将,包括Rust也為基本類型提供了Copy trait來轉換成復制語義价脾。

但是對于大型的復合體,復制語義明顯不適合,因此某些語言區(qū)分了值類型和引用類型妹孙,成了各種面試題喜歡問到的東西涕蜂。

而引用類型的本質是封裝了指針映琳,賦值的時候其實是復制的指針,指針指向的是同一份內存萨西,產生了“引用”的效果。

像Go這類存在指針的語言葱跋,那是否“引用”則清晰多了源梭,不過依然存在slice和map這類引用類型,來對抗復制語義帶來的深拷貝造成的影響荠卷。

而Rust則更加正確,同一份內存在同一時間只能被一個變量所擁有(所有權的概念)油宜,避免了復制語義帶來的影響怜姿,更加精妙的是,因為所有權的概念蚁堤,因此可以實現RAII披诗,這是Rust能夠在無gc的情況下管理內存的關鍵熟空。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掂咒,隨后出現的幾起案子,更是在濱河造成了極大的恐慌绍刮,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岁歉,死亡現場離奇詭異锅移,居然都是意外死亡,警方通過查閱死者的電腦和手機饱搏,發(fā)現死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來备绽,“玉大人鬓催,你說我怎么就攤上這事”睹遥” “怎么了飞苇?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵布卡,是天一觀的道長雇盖。 經常有香客問我,道長贸街,這世上最難降的妖魔是什么狸相? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任脓鹃,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘岩齿。我一直安慰自己盹沈,他們只是感情好吃谣,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布乞封。 她就那樣靜靜地躺著,像睡著了一般岗憋。 火紅的嫁衣襯著肌膚如雪歌亲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天澜驮,我揣著相機與錄音陷揪,去河邊找鬼。 笑死杂穷,一個胖子當著我的面吹牛悍缠,可吹牛的內容都是我干的。 我是一名探鬼主播耐量,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼飞蚓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了廊蜒?” 一聲冷哼從身側響起趴拧,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤山叮,失蹤者是張志新(化名)和其女友劉穎脑又,沒想到半個月后锐借,有當地人在樹林里發(fā)現了一具尸體严卖,經...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡哮笆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了本讥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拷沸。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖跨扮,靈堂內的尸體忽然破棺而出帝嗡,到底是詐尸還是另有隱情哟玷,我是刑警寧澤巢寡,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站爪幻,受9級特大地震影響,放射性物質發(fā)生泄漏京痢。R本人自食惡果不足惜祭椰,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一钉赁、第九天 我趴在偏房一處隱蔽的房頂上張望你踩。 院中可真熱鬧带膜,春花似錦膝藕、人聲如沸芭挽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怀各。三九已至瓢对,卻和暖如春硕蛹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倔毙。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工颁股, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留甘有,地道東北人亏掀。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像该互,于是被迫代替她去往敵國和親宇智。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內容