Rust 基礎教程

Rust 編程語言教程

Rust是一門注重安全、并發和性能的系統編程語言。本文將從Rust的基本語法、常用功能到高級特性,詳細介紹Rust的使用方法。

目錄

  1. 簡介
  2. 環境配置
  3. 基礎語法
    • 變量和常量
    • 數據類型
    • 函數
    • 控制流
  4. 所有權和借用
    • 所有權
    • 借用
  5. 結構體和枚舉
    • 結構體
    • 枚舉
  6. 模塊和包
  7. 錯誤處理
  8. 并發編程
  9. 常用庫和工具
  10. 示例項目

簡介

Rust是一門由Mozilla開發的系統編程語言,它的設計目標是提供內存安全、并發編程和高性能。Rust借鑒了許多現代編程語言的優點,同時引入了獨特的所有權系統,以確保內存安全和線程安全。

環境配置

要開始使用Rust,首先需要安裝Rust編譯器和包管理工具Cargo。

安裝Rust

可以通過Rust的官方安裝工具 rustup 安裝Rust。打開終端并運行以下命令:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

安裝完成后,可以通過以下命令檢查Rust是否安裝成功:

rustc --version
cargo --version

創建第一個Rust項目

使用Cargo創建一個新的Rust項目:

cargo new hello_rust
cd hello_rust

項目目錄結構如下:

hello_rust
├── Cargo.toml
└── src└── main.rs

Cargo.toml 文件是項目的配置文件,main.rs 文件是項目的入口點。

基礎語法

變量和常量

Rust中的變量默認是不可變的,可以使用 let 關鍵字聲明變量,使用 mut 關鍵字聲明可變變量。常量使用 const 關鍵字聲明。

fn main() {let x = 5; // 不可變變量let mut y = 10; // 可變變量const PI: f64 = 3.14159; // 常量println!("x: {}, y: {}, PI: {}", x, y, PI);y = 15;println!("Updated y: {}", y);
}

數據類型

Rust具有多種基本數據類型,包括標量類型和復合類型。

fn main() {// 標量類型let int_var: i32 = 10; // 整數let float_var: f64 = 3.14; // 浮點數let bool_var: bool = true; // 布爾值let char_var: char = 'R'; // 字符// 復合類型let tuple_var: (i32, f64, char) = (10, 3.14, 'R'); // 元組let array_var: [i32; 3] = [1, 2, 3]; // 數組println!("int_var: {}, float_var: {}, bool_var: {}, char_var: {}", int_var, float_var, bool_var, char_var);println!("tuple_var: {:?}", tuple_var);println!("array_var: {:?}", array_var);
}

函數

函數是Rust中的基本代碼單元,使用 fn 關鍵字定義。

fn main() {let result = add(5, 10);println!("Result: {}", result);
}fn add(a: i32, b: i32) -> i32 {a + b
}

控制流

Rust支持常見的控制流結構,如 ifloopwhilefor

fn main() {let number = 5;// if 表達式if number < 10 {println!("number is less than 10");} else {println!("number is 10 or greater");}// loop 循環let mut count = 0;loop {count += 1;if count == 3 {break;}}// while 循環while count < 5 {count += 1;}// for 循環for i in 0..5 {println!("i: {}", i);}
}

所有權和借用

所有權

Rust的所有權系統是其核心特性,確保內存安全。

fn main() {let s1 = String::from("hello");let s2 = s1; // s1的所有權被移動到s2// println!("{}", s1); // 這行代碼將導致編譯錯誤println!("{}", s2);
}

借用

借用可以讓我們在不轉移所有權的情況下使用變量。

fn main() {let s1 = String::from("hello");let len = calculate_length(&s1); // 借用s1println!("The length of '{}' is {}.", s1, len);
}fn calculate_length(s: &String) -> usize {s.len()
}

結構體和枚舉

結構體

結構體用于定義復雜的數據類型。

struct User {username: String,email: String,sign_in_count: u64,active: bool,
}fn main() {let user1 = User {username: String::from("someone"),email: String::from("someone@example.com"),sign_in_count: 1,active: true,};println!("Username: {}", user1.username);
}

枚舉

枚舉用于定義一組可能的值。

enum Message {Quit,Move { x: i32, y: i32 },Write(String),ChangeColor(i32, i32, i32),
}fn main() {let msg = Message::Write(String::from("Hello"));match msg {Message::Quit => println!("Quit"),Message::Move { x, y } => println!("Move to ({}, {})", x, y),Message::Write(text) => println!("Text: {}", text),Message::ChangeColor(r, g, b) => println!("Change color to ({}, {}, {})", r, g, b),}
}

模塊和包

模塊和包用于組織代碼。

mod network {pub fn connect() {println!("Network connected");}pub mod server {pub fn start() {println!("Server started");}}
}fn main() {network::connect();network::server::start();
}

錯誤處理

Rust使用 ResultOption 類型進行錯誤處理。

fn main() {let result = divide(4.0, 2.0);match result {Ok(v) => println!("Result: {}", v),Err(e) => println!("Error: {}", e),}
}fn divide(a: f64, b: f64) -> Result<f64, String> {if b == 0.0 {Err(String::from("Division by zero"))} else {Ok(a / b)}
}

并發編程

Rust通過線程和消息傳遞模型支持并發編程。

use std::thread;
use std::sync::mpsc;fn main() {let (tx, rx) = mpsc::channel();thread::spawn(move || {tx.send(String::from("Hello from thread")).unwrap();});let received = rx.recv().unwrap();println!("Received: {}", received);
}

常用庫和工具

Rust生態系統中有許多常用庫和工具,例如 serde 用于序列化和反序列化,tokio 用于異步編程。

serde

# Cargo.toml
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
use serde::{Serialize, Deserialize};#[derive(Serialize, Deserialize)]
struct Person {name: String,age: u8,
}fn main() {let p = Person {name: String::from("Alice"),age: 30,};let json = serde_json::to_string(&p).unwrap();println!("JSON: {}", json);let p2: Person = serde_json::from_str(&json).unwrap();println!("Name: {}, Age: {}", p2.name, p2.age);
}

示例項目

最后,我們通過一個簡單的示例項目來鞏固學到的知識。

項目描述

創建一個命令行程序,它接受用戶輸入,并計算輸入字符串的單詞數量。

項目結構

word_count
├── Cargo.toml
└── src└── main.rs

代碼實現

use std::env;
use std::fs;fn main() {let args: Vec<String> = env::args().collect();let filename = &args[1];let contents = fs::read_to_string(filename).expect("Something went wrong reading the file");let word_count = contents.split_whitespace().count();println!("The file '{}' contains {} words", filename, word_count);
}

運行項目

cargo run text.txt

以上就是Rust編程語言的詳細教程,從基礎語法到高級特性,希望對您學習Rust有所幫助。Rust是一門強大而高效的語言,掌握它將使您在系統編程和并發編程領域游刃有余。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39376.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39376.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39376.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一文搞懂 java 線程池:基礎知識

你好&#xff0c;我是 shengjk1&#xff0c;多年大廠經驗&#xff0c;努力構建 通俗易懂的、好玩的編程語言教程。 歡迎關注&#xff01;你會有如下收益&#xff1a; 了解大廠經驗擁有和大廠相匹配的技術等 希望看什么&#xff0c;評論或者私信告訴我&#xff01; 文章目錄 …

Linux:網絡基礎1

文章目錄 前言1. 協議1.1 為什么要有協議&#xff1f;1.2 什么是協議&#xff1f; 2. 網絡2.1 網絡通信的問題2.2 網絡的解決方案——網絡的層狀結構2.3 網絡和系統的關系2.4 網絡傳輸基本流程2.5 簡單理解IP地址2.6 跨網絡傳輸 總結 前言 在早期的計算機發展中&#xff0c;一開…

【云計算】阿里云、騰訊云、華為云平臺數據庫對比

目錄 一、云數據庫關鍵信息調研對比 二、詳細功能 1、阿里云RDS 2、騰訊云RDS 3、華為云RDS 一、云數據庫關鍵信息調研對比 云平臺支持數據庫部署對比支持功能備注阿里云 Mysql、Postgresql等 特有數據庫&#xff1a;PolarDB&#xff0c;適配mysql 基礎-單節點賬號管…

實現漸變字體的方案

需要注意&#xff0c;這個切圖是把一整塊&#xff0c;都切出來做的。所以需要用span&#xff0c;不能是div 還有描邊的話&#xff0c;scale會有邊距縮放的問題&#xff0c;描邊就用font weight 來實現 style{{ background: "var(--Linear, linear-gradient(96deg, #fff…

【華為戰報】5月、6月HCIP考試戰報!

華為認證&#xff1a;HCIA-HCIP-HCIE 點擊查看&#xff1a; 【華為戰報】4月 HCIP考試戰報&#xff01; 【華為戰報】2月、3月HCIP考試戰報&#xff01; 【華為戰報】11月份HCIP考試戰報&#xff01; 【HCIE喜報】HCIE備考2個月絲滑通關&#xff0c;考試心得分享&#xff…

Python序列化和反序列化

一.序列化和反序列化 在Python中&#xff0c;序列化&#xff08;Serialization&#xff09;和反序列化&#xff08;Deserialization&#xff09;是處理對象數據的過程&#xff0c;主要用于對象的存儲或網絡傳輸。 序列化&#xff08;Serialization&#xff09; 序列化是將Pyth…

7.x86游戲實戰-C++實現跨進程讀寫-跨進程寫內存

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 上一個內容&#xff1a;6.x86游戲實戰-C實現跨進程讀寫-通過基址讀取人物狀態標志位 上一個內容通過基…

深層神經網絡

深層神經網絡 深層神經網絡 深度神經網絡&#xff08;Deep Neural Networks&#xff0c;DNN&#xff09;可以理解為有很多隱藏層的神經網絡&#xff0c;又被稱為深度前饋網絡&#xff08;DFN&#xff09;&#xff0c;多層感知機&#xff08;Multi-Layer perceptron&#xff0c…

ghost恢復?電腦文件恢復如何操作?電腦數據恢復工具!5款!

在數字化時代&#xff0c;電腦數據的價值日益凸顯。然而&#xff0c;數據丟失、誤刪、系統崩潰等問題時有發生&#xff0c;給個人和企業帶來巨大損失。本文將為您詳細介紹Ghost恢復方法&#xff0c;同時推薦五款高效的電腦數據恢復工具&#xff0c;助您輕松應對數據丟失的困擾。…

使用歸檔實用工具怎么打不開 mac上好用的解壓軟件 歸檔實用工具打不開怎么回事 mac 歸檔實用工具 蘋果電腦好用的壓縮軟件有哪些

Mac系統自帶的 “歸檔實用工具”&#xff0c;集成在系統右鍵菜單中&#xff0c;包含了文件壓縮和壓縮包解壓功能。很多mac小伙伴會發現有些文件使用歸檔實用工具打不開。由于專利和軟件開源問題&#xff0c;該工具目前僅支持ZIP格式的壓縮和解壓。同時&#xff0c;對于一些在Wi…

深入探討數據結構:基礎理論與應用實踐

前言 數據結構是計算機科學的重要組成部分&#xff0c;是編程與算法設計的基礎。本文將系統地介紹數據結構的基礎概念、常見類型、具體實現及其在實際開發中的應用&#xff0c;幫助讀者深入理解這一核心領域。 一、數據結構的基本概念 數據結構指的是計算機中數據的組織、管…

推廣旅游卡項目,一個月創收十幾萬,為何說旅游卡項目堪稱盈利利器?

推廣旅游卡項目&#xff0c;一月個創收十幾萬&#xff0c;為何說旅游卡項目堪稱盈利利器&#xff1f; 其精髓恰在于那十六字真言&#xff1a;即時收益&#xff0c;高額利潤&#xff0c;操作簡便&#xff0c;粉絲友好。接下來&#xff0c;我將從推廣人員的視角&#xff0c;為您…

Microsoft SQL Server 2019安裝和設置用戶密碼

1、免費下載兩個安裝包 SQL2019-SSEI-Dev 地址:https://www.microsoft.com/en-us/sql-server/sql-server-downloads SSMS-Setup-CHS 地址:https://aka.ms/ssmsfullsetup 安裝具體不在闡述了&#xff0c;可以參考我這篇文章&#xff1a;SQL Server 2019安裝詳細教程 2、以W…

開發常見的http狀態碼.——400,401,403,404,500,501,503,狀態碼大全!

目錄 一. 1開頭的(臨時信息響應碼) 二. 2開頭的(成功信息碼) 三. 3開頭的(重定向信息碼) 四. 4開頭的(客戶端錯誤信息碼) 五. 5開頭的(服務器內部錯誤信息碼) 一. 1開頭的(臨時信息響應碼) 100&#xff1a;繼續請求。示意請求者應當繼續發送請求&#xff0c;客戶端返回此碼…

Cookie的默認存儲路徑以及后端如何設置

問題場景 最近在寫一個前后端分離的項目&#xff0c;需要跨域&#xff0c;前端開發同學遇到一個問題一直報錯&#xff0c;本質上就是后端返回的cookie中的sessionID在前端發送http請求時無法被請求自動攜帶&#xff0c;每次htttpRequest都被后端識別為一個新的session&#xf…

Spring MVC數據綁定和響應——數據回寫(二)JSON數據的回寫

項目中已經導入了Jackson依賴&#xff0c;可以先調用Jackson的JSON轉換的相關方法&#xff0c;將對象或集合轉換成JSON數據&#xff0c;然后通過HttpServletResponse將JSON數據寫入到輸出流中完成回寫&#xff0c;具體步驟如下。 1、修改文件DataController.java&#xff0c;在…

verilog 參數用法

參數比較運算 localparam QPLL_FBDIV_IN (QPLL_FBDIV_TOP 16) ? 10b0000100000 : (QPLL_FBDIV_TOP 20) ? 10b0000110000 :(QPLL_FBDIV_TOP 32) ? 10b0001100000 :(QPLL_FBDIV_TOP 40) ? 10b0010000000 :(QPLL_FBDIV_TOP 64) ? 10b0011100000 :(QPLL_FBDIV_TO…

昇思25天學習打卡營第04天 | 數據集 Dataset

昇思25天學習打卡營第04天 | 數據集 Dataset 文章目錄 昇思25天學習打卡營第04天 | 數據集 Dataset數據集加載數據集迭代數據集的變換shufflemapbatch 自定義數據集可隨機訪問數據集對象可迭代數據集生成器 總結打卡 數據集Dataset對原始數據進行封裝、變換&#xff0c;為神經網…

Linux 靜態庫 和 動態庫

在Linux系統上&#xff0c;庫文件用于共享和重用代碼。根據使用方式和鏈接方式的不同&#xff0c;庫文件可以分為靜態庫和動態庫。 靜態庫&#xff08;Static Library&#xff09; 靜態庫是在編譯時被嵌入到最終可執行文件中的庫。靜態庫的擴展名通常是.a。 特點 獨立性&am…

ADOP帶你了解:SFP 光模塊:構建高速網絡的關鍵技術

在數字化時代&#xff0c;企業運營的效率往往取決于數據傳輸的速度。因此&#xff0c;構建一個可靠的網絡基礎架構至關重要。本指南深入探討了小型可插拔&#xff08;SFP&#xff09;光收發器的關鍵作用&#xff0c;這些設備確保了網絡中數據的高效和安全流動。SFP光收發器的設…