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