讓我們從Rust語言的背景開始,探索它的起源。Rust最初是Mozilla研究院在2006年的一個個人項目。第一個穩定的公開版本發布于2015年5月,但在此之前Mozilla已經在生產軟件中使用了Rust。2021年,Rust基金會成立,其憲章是管理Rust發布路線圖和語言治理。多年來,許多大公司(如亞馬遜、谷歌、微軟、Meta等)采用Rust進行系統和應用程序開發。截至撰寫本文時,當前的發布版本是1.74.0。
Rust被認為是一種重要的語言,主要原因是它的執行速度、內存管理/安全性以及并發能力。
與其他語言相比,Rust程序免受以下問題的困擾:
當你開始使用Rust時,我發現最令人沮喪但同時也最有益的能力是,編譯器幾乎會引導你編寫正確的代碼。但它非常挑剔。Rust是一種靜態且強類型的語言。變量類型必須在編譯時已知,試圖將一種類型的變量賦值給另一種類型的變量會導致編譯錯誤。編譯器會提供盡可能多的信息,甚至是解決方案。
下面是一個嘗試將字符串傳遞給無符號整數變量的人為示例。
在Mac上,您還需要運行以下命令來啟用從命令行啟動VS Code。在VS Code中通過運行以下命令來完成此操作。
通過??P打開命令面板,并鍵入shell command來找到Shell Command:
在執行“Install ‘code’ command in PATH”命令之前,先使用“Uninstall ‘code’ command in PATH”命令。
執行該命令后,您就可以在任何文件夾中簡單地鍵入 code . 來打開VS Code并開始編輯該文件夾中的文件。
在Rust的入門討論中,如果不提到這個對語言學習者來說神奇的工具,那就不完整了。如果你想嘗試運行Rust代碼,卻不想安裝它,或者你想快速測試一些代碼,可以使用Rust Playground:https://play.rust-lang.org/。這是一個功能齊全的Rust環境,允許你交互、調試甚至分享你的Rust代碼。
Rust Playground擁有很多優秀的功能。這包括訪問用于格式化或審查Rust代碼的工具(我們將在下面探討這些)。如你所見,它甚至能輕松地與他人分享代碼,比如,通過點擊這個鏈接:
https://play.rust-lang.org/?versinotallow=stable&mode=debug&editinotallow=2021&gist=94762255ffdfc1bf6ca26a6ec10154b9
Cargo是Rust的構建系統和包管理器。Cargo為你處理許多任務,如構建代碼、下載代碼依賴的庫以及構建這些依賴。我發現使用Cargo是管理Rust項目最簡單的方式。
% cargo --versioncargo 1.74.0 (ecb9851af 2023-10-18)
這是我當前系統上的結果,因為我正在運行Rust 1.74.0。
Cargo允許高效管理新項目,讓我向你展示我覺得有用的流程。
cargo new hello_cargocd hello_cargocode .
這將創建一個帶有依賴管理文件、git文件的新項目,切換到那個目錄,然后用VS Code打開那個文件夾。
創建的依賴管理文件名為Cargo.toml。toml是Cargo的配置格式。
[package]name = "hello_cargo"version = "0.1.0"edition = "2021"# 詳細信息請見 https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]
Cargo希望你的源文件位于src目錄內。
如果你通過其他方式開始一個項目,可以通過確保項目代碼在src目錄內,并創建一個適當的Cargo.toml文件(如上所示),輕松將其轉換為使用Cargo的項目。
常用的Cargo命令包括:
# 清理項目的構建產物cargo clean# 檢查是否能編譯,但不進行構建cargo check# 構建項目cargo build# 構建不帶調試信息的發布版本cargo build --release# 運行項目cargo run# 打開包含項目文檔的頁面(包括任何///注釋)cargo doc --open# 自動修復代碼問題cargo fix
在Rust中,crate是編譯器一次考慮的最小代碼單元。crate有兩種形式:二進制crate和庫crate。二進制crate是你可以編譯成可執行文件的程序,比如命令行程序或服務器。這些程序有一個叫做main的函數。Crate可以包含模塊,這些模塊可能在其他文件中定義。
庫crate沒有main函數,它們不編譯成可執行文件。相反,它們定義的功能旨在與多個項目共享。
包(package)是一個或多個crate的捆綁,提供一組功能。包含一個Cargo.toml文件,描述如何構建這些crate。
在本系列后續文章中,我們將看到如何將應用程序分割成不同的crate、包和模塊的示例。
rustfmt是一個工具,用于根據社區代碼風格指南格式化Rust代碼。它是非常可配置的,你可以創建一個名為rustfmt.toml的文件,并設置這里找到的任何參數來格式化你的代碼。
直接運行:
rustfmt main.rs
由于我發現Cargo是所有命令行工具的首選選項,我只需簡單運行:
cargo fmt
注意,rustfmt也是Rust Playground中TOOLS下的一個選項。
Clippy工具是一組靜態代碼分析規則的集合,用于標記編程錯誤、bug、風格錯誤和可疑結構。Clippy用于分析你的代碼,以便你可以捕捉常見錯誤并改進你的Rust代碼。
它可以通過輸入以下命令簡單運行:
cargo clippy
注意,clippy也是Rust Playground中TOOLS下的一個選項。
在本文的最后一部分,我們將探討Rust支持的原始類型(primitive types)。
Rust中最簡單的類型被稱為原始類型。這些包括數字、字符和字符串。我們將從整數類型開始,即沒有小數點的整數。整數類型分為有符號和無符號兩種。
有符號整數類型以字母‘i’開頭,大小范圍從8到128,如下所示。
無符號整數類型以字母‘u’開頭,大小范圍同樣從8到128,如下所示。
Rust使用usize作為索引的大小。usize是用于索引的最佳大小,因為索引不能為負數,允許在大型索引空間中靈活使用,并且需要適應32位計算機。
只要源變量中的內容能夠適應目標變量類型的最大值,你就可以在不同整數類型之間進行賦值。下面是一個例子。如果將第二行改為128,則第四行將失敗,因為i8類型的最大值是127,而我們聲明它為i8。
fn main() { let mut i = 127; let j: i8 = 12; i = j; println!("{}", i)}
我們將在后面討論mut關鍵字的使用,但現在只需知道它允許在聲明后對i進行賦值。默認情況下,變量是不可變的(不允許被更改)。
如果未聲明類型,則整數的默認大小為i32,所以上面的變量i將是i32類型。
浮點數是帶有小數點的數字。10.5是一個浮點數,而2是一個整數。就像整數一樣,它們由諸如f32或f64之類的類型定義。也像整數一樣,如果環境支持,f64是默認的浮點數類型。
字符(char)類型始終使用4個字節。但字符串不同,單個字符不總是使用4個字節。當字符是字符串的一部分(而不是char類型)時,字符串被編碼為使用每個字符所需的最少內存量。
字符的大小和字符串的變化如下面的代碼片段所示。
use std::time::{Instant};fn main() { let now = Instant::now(); println!("Size of a char: {}", std::mem::size_of::<char>()); println!("Size of a: {}", "a".len()); println!("Size of ?: {}", "?".len()); println!("Size of 國: {}", "國".len()); println!("Size of : {}", "".len()); let now2 = Instant::now(); println!("==> {} ms", now2.duration_since(now).as_micros());}
結果如下。請注意,還添加了一些代碼來顯示微秒級的運行時長。
Size of a char: 4Size of a: 1Size of ?: 2Size of 國: 3Size of : 4==> 6773 ms
請注意,.len()方法返回的是字節數,而不是字母數。
上面的例子展示了如何從Instant庫中包含一個標準庫函數,now()。這是在頂部使用use關鍵字包含的。
每種類型的詳細信息可以在這里找到。
https://doc.rust-lang.org/reference/types.html
這篇文章為學習Rust語言打下了基礎。我們探討了安裝Rust、運行程序的替代方案、基本工具以及Rust中可用的原始數據類型的概述。在下一節中,我們將探討內存管理的重要話題,以及借用(borrowing)、遮蔽(shadowing)、所有權(ownership)以及不可變性等概念。理解這些概念,其中一些是Rust獨有的,對于精通這種語言至關重要。
Rust的內存管理是其核心特性之一,不同于傳統語言如C或C++中的手動內存管理,Rust通過所有權系統自動處理內存,旨在減少內存泄漏和其他常見錯誤。在Rust中,每一個值都有一個被稱為其“所有者”的變量,值在任何時候都只能有一個所有者。當所有者離開作用域時,值將被丟棄。
借用是Rust中另一個重要概念。它允許我們創建指向數據的引用,但不取得所有權。這意味著數據可以被多個部分的代碼安全地訪問,而不會引起數據競爭或其他問題。
遮蔽則允許我們重新使用變量名。這意味著你可以在同一個作用域內聲明一個新的同名變量,新變量會“遮蔽”掉舊變量。
不可變性是Rust的另一個核心概念。在Rust中,默認情況下,所有變量都是不可變的。這增加了代碼的安全性和清晰性。當然,如果需要,你可以通過使用mut關鍵字明確指定可變性。
通過了解和掌握這些概念,你將能夠更有效地編寫Rust代碼,并充分利用Rust提供的安全和性能優勢。
在我們的下一篇文章中,我們將深入探討這些概念,并通過實際示例來展示它們在Rust編程中的應用。我們還將探討Rust的錯誤處理機制和模式匹配,這是Rust提供的另一組強大功能。
本文鏈接:http://www.www897cc.com/showinfo-26-77679-0.htmlRust學習筆記:基礎概念介紹
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 一個新名詞之CSS高度塌陷