Rust 1.2.0 翻譯官網總結(一)

介紹

Rust 編程語言

歡迎學習本教程!本教程將教你如何使用 Rust 編程語言。Rust 是一門強調安全、性能和併發性的系統編程語言。它爲了達到這幾個目的,甚至沒有一個垃圾收集器。這也使 Rust 可以應用到其餘語言作不到的地方:嵌入到其餘語言,有指定空間和時間需求的程序,寫底層代碼(如設備驅動程序和操做系統)。針對當前的其餘編程語言,Rust 作到了沒有運行時(Runtime),沒有數據競爭。 Rust 也致力於實現「零成本抽象」,儘管這些抽象給人的感受像一個高級的語言。即便是這樣,Rust 仍然能夠作到像一個低級的語言那樣的精確控制。html

「Rust 編程語言」分爲七個部分。本文的簡介是第一個。在這以後:git

  • 新手入門 - 設置您的電腦來進行 Rust 開發。github

  • 學習 Rust - 經過小型項目學習 Rust 編程。web

  • 高效的 Rust - 學習編寫優秀 Rust 代碼的一些高級概念。編程

  • 語法和語義 - Rust 的每一部分,分解成小塊來說解。安全

  • 每日 Rust - 還沒有構建穩定的一些高端特性。併發

  • 術語 - 本教程的相關參考科目。編程語言

  • 學術研究 - 影響 Rust 的一些著做。函數

閱讀本文以後,你會想了解「學習 Rust」或「語法和語義」,根據你的喜愛:若是你想嘗試一個項目,能夠學習 「學習 Rust」章節;或者若是你喜歡從小的部分開始,完全的學習了一個概念以後才移動到下一個概念,那麼你能夠學習「語法和語義」章節。豐富的交叉聯合使這些部分鏈接到一塊兒。性能

貢獻

本教程的源文件能夠在 Github 上找到: github.com/rust-lang/rust/tree/master/src/doc/trpl

Rust 的一個簡單介紹

Rust 是你可能會感興趣的一門語言麼?讓咱們先來看看一些能展現其一些優點的小代碼示例。

讓 Rust 變得獨特惟一的一個主要的概念是名稱爲「全部權」的概念。思考下面這個小例子:

    fn main() {        let mut x = vec!["Hello", "world"];
    }

這個程序有一個變量綁定名稱爲 x。此綁定的值是一個 Vec<T>,是咱們經過在標準庫中定義的宏建立的一個'向量'。這個宏被稱爲 Vec,咱們利用!調用宏用。這遵循 Rust 的通常原則:作事情要明確。宏能夠有效的作一些比函數調用更復雜的東西,因此他們外觀上來看是不同的。這個符號!也有助於解析,使代碼更容易編寫,這也很重要。

咱們使用 mut 使 x 可變:默認狀況下,Rust 中的綁定是不可變的。咱們將在後面的例子中改變此向量。

另外值得一提的是,在這裏咱們不須要標註類型:Rust 是靜態類型,咱們並不須要再明確標註類型。Rust 有類型推斷,用以平衡強大的靜態類型和冗長標註類型。

Rust 更傾向於堆棧分配而不是堆分配:x 被直接放置在堆棧中。然而,Vec<T> 類型是在堆上分配的向量元素的空間。若是你不熟悉它們之間的區別,那麼你如今能夠先忽略它,或者你能夠查看章節「堆棧和堆」,來了解詳細瞭解。做爲一個系統編程語言,Rust 賦予了你如何分配內存空間的能力,可是在咱們開始的階段,這是並非一個大問題。

此前,咱們提到的「全部權」是鐵鏽的關鍵新概念。生鏽的說法,X 被說成「本身」的載體。這意味着,當 x 超出範圍,載體的存儲器將被解除分配。這是由防鏽編譯肯定性完成,而不是經過一個機制,諸如垃圾收集器。換句話說,在防鏽,你不叫喜歡的 malloc 函數和釋放本身:編譯靜態判斷,當你須要分配或釋放內存,並插入這些調用自己。犯錯是作人,但編譯器永遠不會忘記。

前面咱們所提到的,「全部權」是 Rust 中的一個很是重要的新概念。按照 Rust 的說法,x 被稱爲向量「全部」。這意味着當 x 超出範圍,向量的內存將被銷燬。這樣作是由 Rust 的編譯器所決定的,而不是經過一種機制(如垃圾收集器)所決定的。換句話說,在 Rust 中,你不須要本身調用函數,如 malloc  free yourself: 當你須要分配或釋放的內存時,編譯器會自行靜態的決定並插入這些調用函數。犯錯是人之常情,但編譯器永遠不會忘記插入這些調用的函數。

讓咱們在咱們上面的例子中添加另外的一行代碼:

    fn main() {        let mut x = vec!["Hello", "world"];        let y = &x[0];
    }

咱們在此介紹了另外的一種綁定 ,y。在這種狀況下,y 是向量第一個元素的一個「引用」。Rust 的引用與其餘語言中的指針相似,不一樣的是有額外的編譯時安全檢查。特別指出的是,引用與全部權系統經過「借用」來相互做用,而不是經過擁有它。不一樣的是,當引用超出範圍時,它不會釋放底層的內存。若是是那樣,咱們將會釋放兩次內存,這是顯然是不正確的!

讓咱們來添加第三行代碼。表面上來是沒錯的,可是它會致使一個編譯錯誤:

    fn main() {        let mut x = vec!["Hello", "world"];        let y = &x[0];

        x.push("foo");
    }

push 是將一個元素附加到向量組末端的方法。當咱們試圖編譯這個程序時,咱們將獲得一個錯誤:

    error: cannot borrow `x` as mutable because it is also borrowed as immutable
        x.push("foo");
        ^    note: previous borrow of `x` occurs here; the immutable borrow prevents
    subsequent moves or mutable borrows of `x` until the borrow ends        let y = &x[0];
                 ^    note: previous borrow ends here
    fn main() {

    }
    ^

Rust 編譯器給了很詳細的錯誤,這是其中的一次。如錯誤解釋中所說,雖然咱們的綁定是可變的,但咱們仍不能調用 push 方法。這是由於咱們已經有了一個矢量元素的引用 ,y。當另外的一個引用存在時,改變某些變量是危險的行爲,由於咱們可能致使引用的無效。在這個特定的例子中,當建立向量時,咱們可能只分配了三個元素的空間。添加第四個元素意味着全部這些元素將會被分配一塊新的塊內存,同時複製舊值到新內存,更新內部指針到新內存。這些工做都沒有什麼問題。問題是, y 不會更新,因此咱們會有一個「懸空指針」。那就不對了。在這種狀況下,任何的使用引用 y,將會致使錯誤,因此編譯器已經幫咱們捕捉到了這個錯誤。

那麼,咱們如何解決這個問題呢?有兩種咱們能夠採用的方法。第一種方法,咱們利用拷貝而不是一個引用:

    fn main() {        let mut x = vec!["Hello", "world"];        let y = x[0].clone();

        x.push("foo");
    }

在默認狀況下,Rust 有移動語義,全部若是咱們想要複製一些數據,咱們能夠調用 clone() 方法。在這個例子中 ,y 再也不是存儲在 x 中向量的一個引用,而是它的第一個元素「 Hello 」的一個副本。如今沒有引用,咱們的 push() 方法能夠很好地運行。

若是咱們真的想用一個引用,咱們須要另一種選擇:確保在咱們嘗試作改變以前,咱們的引用跳出其做用域。寫法看起來像這樣:

    fn main() {        let mut x = vec!["Hello", "world"];

        {            let y = &x[0];
        }

        x.push("foo");
    }

咱們用一組額外的大括號建立了一個內部做用域。在咱們調用 push() 以前,y 已經跳出其做用域。因此這樣是可行的。

全部權的概念不只有利於防止懸空指針,並且有利於解決與其相關的全部問題,如迭代器失效,併發性等等。

Rust 託管地址:http://wiki.jikexueyuan.com/project/rust/introduction.html

相關文章
相關標籤/搜索