rust語言特色及基礎配置

Rust是mozilla推出的一款系統級的編程語言,其兩大特色在於零開銷抽象和安全性。
在大學裏時候,就開始注意到rust語言的動態了。
當時,我在啃一本大塊頭的C++書籍《C++ Primer》,以爲rust到處針對到了C++的痛處。
學習rust,即可以讓你用不輸於C++的特性編程,而又不用花費太多的精力在語法的各類特例和各類細枝末節的坑中。html

優秀的程序員都須要掌握多語言以學習不一樣的思惟方式。對於系統級語言,rust是至關優秀的,
最近趁着有點時間,得好好學習一下這門我垂誕已久的語言了。java

<!--more-->git

rust的特色

在大學裏時候,就開始注意到rust語言的動態了。當時,我在啃一本大塊頭的C++書籍《C++ Primer》。程序員

C++是至關難學,其中是由於其由於歷史遺留緣由及與C的兼容性,致使語法正交性、統一性差,
要學習的語法點及要避免的踩坑點至關之多,乃至於一部分同窗都是「C++從入門到放棄」了。(我也是
而剩下一部分說用C++的同窗,其實是C with class,不敢用過高級的特性,怕hold不住。。。github

擁有做爲系統級語言C++的優點

相似於C++,Rust的定位是一款系統級語言,所以,它具備C++做爲系統級語言的全部特色:編程

  1. 零開銷抽象 。抽象不會引入額外的開銷,編譯器會編譯出很是高性能的機器代碼。
  2. 沒有gc 。系統級語言須要應用於實時性要求高的場景,不能用gc。也用於編寫底層基礎設施,沒有必要用gc。
  3. 內存模型沒有高度封裝。和C++同樣,你便可以將對象分配到棧上,也能夠將對象分配到堆上。
    對於系統級的語言須要這些的細粒度控制力,而不是像java之類的高級語言,只須要知道引用的概念便可使用java了,無需關心內存分配問題。

擁有更強的靜態類型檢查和現代語言特性

除此以外,除了擁有C++優勢外,它還有:安全

  1. 語法乾淨正交,沒有C++那麼繁瑣。
  2. 安全性。Rust語法引入全部權和生命期概念,在編譯期就能檢查出一部份內存管理錯誤,
    這是rust的一個殺手鐗的特性。
  3. 現代語言特性。語言特性吸取了現代語言的大量優秀特性,支持多範式。

沒有C++的歷史遺留問題

從我瞭解到的信息來看,還有如下幾種對標C++的特色,對於一個初學者,目前感覺還不是很大:bash

  1. 現代化的模塊系統,比C++那種古老的繼承C語言的方式(利用#include預編譯和編譯單元的概念)要好用不少。
  2. 更好用的泛型。比C++的模板更容易使用。

rust開發環境的搭建

第一步,安裝rust工具鏈:
官方網站推薦的方式是:curl

curl https://sh.rustup.rs -sSf | sh

這樣,會將rust工具鏈安裝到~/.cargo/bin目錄下,包括rustc、cargo 及 rustup。編程語言

推薦爬牆下載,我選擇proxychains:

proxychains curl https://sh.rustup.rs -sSf > tmp.sh
sh tmp.sh

第二步:安裝IDE。
我推薦使用jetbrains推出的rust插件。找一個jetbrains的IDE安裝就好了。
做爲一名java碼農,我選擇idea。與把大象放入冰箱同樣輕鬆,只需簡單三步:

  1. 打開intellij idea。
  2. Settings -> Plugins,安裝rust插件。
  3. Settings -> Languages & Framworks -> Rust 配置標準庫路徑和其餘選項。

好了,新建一個項目,你會發現多了一個rust選擇項。

做爲初學者,不要花費過多精力在工具鏈上,首先應該快速搞起一個環境,而後上手語法寫幾個demo。

第一個rust程序

做爲第一個rust程序,首先來個選擇排序壓壓驚:

fn selection_sort(nums: &mut Vec<i32>) {
    for i in 0.. nums.len() {
        let mut min = i;
        for j in i.. nums.len() {
            if nums[j] < nums[min] {
                min = j;
            }
        }
        nums.swap(i, min);
    }
}

rust中的語法不是C系語法,因此熟悉rust的語法須要多多編寫代碼練習。上面代碼涉及到的語法有:

  1. 首先,使用關鍵字let聲明變量,rust鼓勵使用自動類型推導。
  2. 默認來講,變量默認不可變。若是須要使得變量可變,則須要顯式的聲明爲mut。rust鼓勵使用不可變變量。
    也能夠指定類型,可是和C系語法不一樣,是標註在變量後面。對於習慣C系語法(C,java,js)的人來講,好不習慣。。。
  3. C系語法不須要定義函數的關鍵字,開頭就是返回類型。於此不一樣,rust使用fn做爲定義函數的關鍵字。
  4. rust中也有while循環和for循環。和C系語法不一樣,for循環是用來迭代列表。若是是須要迭代一個數字區間,
    則可使用(1..10),它實際上建立了一個Range<i32>類型的對象並迭代。

接下來是將Vector轉字符串的輔助函數:

fn vector_to_string(nums: &Vec<i32>) -> String {
    let mut s = String::new();
    for i in nums.iter() {
        s += &(i.to_string() + " ");
    }
    return s;
}
  1. String::new暗示出,rust中沒有構造函數和new運算符。怎麼建立對象?用靜態工廠函數。
    這個設計省了不少麻煩,首先,即便給你構造函數,工程實踐上也會再封裝一層各類工廠。
    其次,你不會弄出一個初始化一半的對象。如java中的this引用泄漏。
  2. String對象支持+=操做,這代表Rust支持運算符重載。

最後,main函數:

fn main() {
    let mut v = vec![9, 2, 5, 4, 8, 12, 1];
    selection_sort(&mut v);
    println!("{}", vector_to_string(&v));
}
  1. vec!其實是一個宏,rust支持強大的宏,強大到相似lisp的那種。
  2. &是引用符,涉及到全部權和借用的概念。

學習方法與資料

對於有着必定基礎的程序員,學習一門語言,我的以爲,最有效率的方式是:

  1. 結合現成的示例程序,學習語法教程。
  2. 寫總結,按照本身的理解總結語法,寫筆記。
  3. 寫demo、造輪子。找幾個典型的主題,寫小demo、輪子試試手。

最後,有一些值得學習的資料:

  1. rust官方文檔:https://www.rust-lang.org/zh-...
    學習rust的主要資料。
  2. 《經過例子學習Rust》 https://rustcc.github.io/rust...
    彌補Rust官方文檔的不足,對於語法搭配一部分例子來參考。
  3. rust的awesome系列。https://github.com/rust-unoff...

最後

對於編程語言的理解,每一個人有着不一樣的觀點。

就我我的而言,我更贊同《代碼大全》中的隱喻,即編程語言是程序員工具箱中的一把趁手的工具,整體而言,它儘可能使用良好的設計避免給程序員形成額外的負擔,又具有強大的特性使得程序員能夠優雅實現各種需求。包括統一正交的語法、優秀的類型系統、不破壞統一性的適當的語法糖等。

相關文章
相關標籤/搜索