自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Rust學(xué)習(xí)筆記:基礎(chǔ)概念介紹

開發(fā) 前端
這篇文章為學(xué)習(xí)Rust語言打下了基礎(chǔ)。我們探討了安裝Rust、運行程序的替代方案、基本工具以及Rust中可用的原始數(shù)據(jù)類型的概述。

Rust背景

讓我們從Rust語言的背景開始,探索它的起源。Rust最初是Mozilla研究院在2006年的一個個人項目。第一個穩(wěn)定的公開版本發(fā)布于2015年5月,但在此之前Mozilla已經(jīng)在生產(chǎn)軟件中使用了Rust。2021年,Rust基金會成立,其憲章是管理Rust發(fā)布路線圖和語言治理。多年來,許多大公司(如亞馬遜、谷歌、微軟、Meta等)采用Rust進(jìn)行系統(tǒng)和應(yīng)用程序開發(fā)。截至撰寫本文時,當(dāng)前的發(fā)布版本是1.74.0。

Rust被認(rèn)為是一種重要的語言,主要原因是它的執(zhí)行速度、內(nèi)存管理/安全性以及并發(fā)能力。

與其他語言相比,Rust程序免受以下問題的困擾:

  • 懸空指針
  • 數(shù)據(jù)競爭
  • 緩沖區(qū)溢出
  • 迭代器失效

當(dāng)你開始使用Rust時,我發(fā)現(xiàn)最令人沮喪但同時也最有益的能力是,編譯器幾乎會引導(dǎo)你編寫正確的代碼。但它非常挑剔。Rust是一種靜態(tài)且強類型的語言。變量類型必須在編譯時已知,試圖將一種類型的變量賦值給另一種類型的變量會導(dǎo)致編譯錯誤。編譯器會提供盡可能多的信息,甚至是解決方案。

下面是一個嘗試將字符串傳遞給無符號整數(shù)變量的人為示例。

不用擔(dān)心上面的代碼,現(xiàn)在只關(guān)注以下幾行,解釋究竟發(fā)生了什么。它告訴我們問題出現(xiàn)在第3行,以及具體的問題是什么。我們將在本文的后續(xù)部分以及未來的文章中進(jìn)一步探討為什么會發(fā)生這種類型錯誤。

3 | let j : u32 = i;
  | — — ^ expected `u32`, found `String`

Rust安裝指南

在探索Rust的過程中,我們會發(fā)現(xiàn)其工具鏈非常出色,從安裝開始就不例外。

Rustup

Rustup 是安裝 Rust 的工具,它允許用戶在穩(wěn)定版、測試版和夜間版編譯器構(gòu)建之間切換,并且可以在每個類別中保持更新到新版本。它在Rust支持的所有平臺上運行。我們將探討提供的文檔,Rustup 有自己的書籍可以在這里找到。

訪問 https://rustup.rs/,它會嘗試檢測您的操作系統(tǒng)并展示安裝Rust的方法。在我的Mac上,它檢測到Unix系統(tǒng)并提供了curl安裝方法。但使用Homebrew安裝會更簡單。

brew install rustup

安裝完成后,運行以下命令來初始化您的Rust環(huán)境。

rustup-init

然后通過運行以下命令來驗證。

rustc --version

您可以通過運行以下命令來確保擁有最新版本。

rustup upgrade

如果有最新版本可用,它將安裝該版本。Rust的升級周期相對較頻繁,因此您可能需要比使用其他語言時更頻繁地運行此命令。

如果您想知道像rustc、cargo和rustup這樣的工具安裝在哪里,請查看 $HOME/.cargo/bin 目錄。

Visual Studio Code

雖然有幾種IDE可用于Rust,但我發(fā)現(xiàn)Visual Studio Code非常好用。假設(shè)您已經(jīng)使用rustup安裝了Rust,并且安裝了Visual Studio Code,您會想安裝“rust-analyzer”擴展。我還安裝了“rust”擴展。

在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 Playground

在Rust的入門討論中,如果不提到這個對語言學(xué)習(xí)者來說神奇的工具,那就不完整了。如果你想嘗試運行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

Cargo是Rust的構(gòu)建系統(tǒng)和包管理器。Cargo為你處理許多任務(wù),如構(gòu)建代碼、下載代碼依賴的庫以及構(gòu)建這些依賴。我發(fā)現(xiàn)使用Cargo是管理Rust項目最簡單的方式。

% cargo --version
cargo 1.74.0 (ecb9851af 2023-10-18)

這是我當(dāng)前系統(tǒng)上的結(jié)果,因為我正在運行Rust 1.74.0。

Cargo允許高效管理新項目,讓我向你展示我覺得有用的流程。

cargo new hello_cargo

cd hello_cargo

code .

這將創(chuàng)建一個帶有依賴管理文件、git文件的新項目,切換到那個目錄,然后用VS Code打開那個文件夾。

創(chuàng)建的依賴管理文件名為Cargo.toml。toml是Cargo的配置格式。

[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"

# 詳細(xì)信息請見 https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

Cargo希望你的源文件位于src目錄內(nèi)。

如果你通過其他方式開始一個項目,可以通過確保項目代碼在src目錄內(nèi),并創(chuàng)建一個適當(dāng)?shù)腃argo.toml文件(如上所示),輕松將其轉(zhuǎn)換為使用Cargo的項目。

常用的Cargo命令包括:

# 清理項目的構(gòu)建產(chǎn)物
cargo clean

# 檢查是否能編譯,但不進(jìn)行構(gòu)建
cargo check

# 構(gòu)建項目
cargo build

# 構(gòu)建不帶調(diào)試信息的發(fā)布版本
cargo build --release

# 運行項目
cargo run

# 打開包含項目文檔的頁面(包括任何///注釋)
cargo doc --open

# 自動修復(fù)代碼問題
cargo fix

Crate(箱)

在Rust中,crate是編譯器一次考慮的最小代碼單元。crate有兩種形式:二進(jìn)制crate和庫crate。二進(jìn)制crate是你可以編譯成可執(zhí)行文件的程序,比如命令行程序或服務(wù)器。這些程序有一個叫做main的函數(shù)。Crate可以包含模塊,這些模塊可能在其他文件中定義。

庫crate沒有main函數(shù),它們不編譯成可執(zhí)行文件。相反,它們定義的功能旨在與多個項目共享。

包(package)是一個或多個crate的捆綁,提供一組功能。包含一個Cargo.toml文件,描述如何構(gòu)建這些crate。

在本系列后續(xù)文章中,我們將看到如何將應(yīng)用程序分割成不同的crate、包和模塊的示例。

工具

rustfmt

rustfmt是一個工具,用于根據(jù)社區(qū)代碼風(fēng)格指南格式化Rust代碼。它是非??膳渲玫?,你可以創(chuàng)建一個名為rustfmt.toml的文件,并設(shè)置這里找到的任何參數(shù)來格式化你的代碼。

直接運行:

rustfmt main.rs

由于我發(fā)現(xiàn)Cargo是所有命令行工具的首選選項,我只需簡單運行:

cargo fmt

注意,rustfmt也是Rust Playground中TOOLS下的一個選項。

clippy

Clippy工具是一組靜態(tài)代碼分析規(guī)則的集合,用于標(biāo)記編程錯誤、bug、風(fēng)格錯誤和可疑結(jié)構(gòu)。Clippy用于分析你的代碼,以便你可以捕捉常見錯誤并改進(jìn)你的Rust代碼。

它可以通過輸入以下命令簡單運行:

cargo clippy

注意,clippy也是Rust Playground中TOOLS下的一個選項。

Primitive Types

在本文的最后一部分,我們將探討Rust支持的原始類型(primitive types)。

Rust中最簡單的類型被稱為原始類型。這些包括數(shù)字、字符和字符串。我們將從整數(shù)類型開始,即沒有小數(shù)點的整數(shù)。整數(shù)類型分為有符號和無符號兩種。

有符號整數(shù)類型以字母‘i’開頭,大小范圍從8到128,如下所示。

  • i8
  • i16
  • i32
  • i64
  • i128

無符號整數(shù)類型以字母‘u’開頭,大小范圍同樣從8到128,如下所示。

  • u8
  • u16
  • u32
  • u64
  • u128

Rust使用usize作為索引的大小。usize是用于索引的最佳大小,因為索引不能為負(fù)數(shù),允許在大型索引空間中靈活使用,并且需要適應(yīng)32位計算機。

只要源變量中的內(nèi)容能夠適應(yīng)目標(biāo)變量類型的最大值,你就可以在不同整數(shù)類型之間進(jìn)行賦值。下面是一個例子。如果將第二行改為128,則第四行將失敗,因為i8類型的最大值是127,而我們聲明它為i8。

fn main() {
    let mut i = 127;
    let j: i8 = 12;
    i = j;
    println!("{}", i)
}

我們將在后面討論mut關(guān)鍵字的使用,但現(xiàn)在只需知道它允許在聲明后對i進(jìn)行賦值。默認(rèn)情況下,變量是不可變的(不允許被更改)。

如果未聲明類型,則整數(shù)的默認(rèn)大小為i32,所以上面的變量i將是i32類型。

浮點數(shù)是帶有小數(shù)點的數(shù)字。10.5是一個浮點數(shù),而2是一個整數(shù)。就像整數(shù)一樣,它們由諸如f32或f64之類的類型定義。也像整數(shù)一樣,如果環(huán)境支持,f64是默認(rèn)的浮點數(shù)類型。

字符(char)類型始終使用4個字節(jié)。但字符串不同,單個字符不總是使用4個字節(jié)。當(dāng)字符是字符串的一部分(而不是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: 4
Size of a: 1
Size of ?: 2
Size of 國: 3
Size of : 4
==> 6773 ms

請注意,.len()方法返回的是字節(jié)數(shù),而不是字母數(shù)。

上面的例子展示了如何從Instant庫中包含一個標(biāo)準(zhǔn)庫函數(shù),now()。這是在頂部使用use關(guān)鍵字包含的。

每種類型的詳細(xì)信息可以在這里找到。

https://doc.rust-lang.org/reference/types.html

總結(jié)

這篇文章為學(xué)習(xí)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中,每一個值都有一個被稱為其“所有者”的變量,值在任何時候都只能有一個所有者。當(dāng)所有者離開作用域時,值將被丟棄。

借用是Rust中另一個重要概念。它允許我們創(chuàng)建指向數(shù)據(jù)的引用,但不取得所有權(quán)。這意味著數(shù)據(jù)可以被多個部分的代碼安全地訪問,而不會引起數(shù)據(jù)競爭或其他問題。

遮蔽則允許我們重新使用變量名。這意味著你可以在同一個作用域內(nèi)聲明一個新的同名變量,新變量會“遮蔽”掉舊變量。

不可變性是Rust的另一個核心概念。在Rust中,默認(rèn)情況下,所有變量都是不可變的。這增加了代碼的安全性和清晰性。當(dāng)然,如果需要,你可以通過使用mut關(guān)鍵字明確指定可變性。

通過了解和掌握這些概念,你將能夠更有效地編寫Rust代碼,并充分利用Rust提供的安全和性能優(yōu)勢。

在我們的下一篇文章中,我們將深入探討這些概念,并通過實際示例來展示它們在Rust編程中的應(yīng)用。我們還將探討Rust的錯誤處理機制和模式匹配,這是Rust提供的另一組強大功能。

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2009-08-13 11:10:32

C#基礎(chǔ)概念

2010-07-27 15:42:18

AdobeFlex

2009-11-05 11:31:00

WCF綁定

2022-12-09 07:13:20

2010-07-13 14:16:56

Perl控制流

2009-08-13 10:52:03

C#基礎(chǔ)概念

2017-03-21 11:02:59

基礎(chǔ)深度學(xué)習(xí)備忘錄

2020-05-08 13:44:26

Spark架構(gòu)RDD

2023-05-29 16:25:59

Rust函數(shù)

2011-08-04 14:58:37

Objective-C Cocoa NSString

2010-07-21 17:00:58

bada接口

2023-06-15 17:00:11

Rust循環(huán)

2024-11-08 09:19:28

2022-12-30 11:05:40

Rust代碼

2009-07-14 17:01:24

JDBC基礎(chǔ)

2010-06-18 09:57:46

C#UML基礎(chǔ)

2010-07-23 13:16:07

Perl

2011-03-08 10:27:25

MongoDB介紹安裝

2009-07-09 16:24:48

JDK學(xué)習(xí)筆記Java語言基礎(chǔ)

2017-07-27 13:34:52

Rust所有權(quán)數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號