Rust 進階教程

Rust 進階教程

在基礎教程中,我們已經了解了Rust的基本語法和核心概念。本文將進一步探討Rust的進階特性和應用,包括泛型、閉包、迭代器、異步編程、宏和unsafe代碼等。

目錄

  1. 泛型
  2. 閉包和迭代器
    • 閉包
    • 迭代器
  3. 異步編程
  4. Unsafe代碼
  5. FFI(外部函數接口)
  6. 設計模式
  7. 性能優化
  8. 案例分析

泛型

泛型允許我們編寫更通用和復用的代碼。Rust中的泛型主要用于函數、結構體、枚舉和方法。

泛型函數

fn largest<T: PartialOrd>(list: &[T]) -> &T {let mut largest = &list[0];for item in list.iter() {if item > largest {largest = item;}}largest
}fn main() {let number_list = vec![34, 50, 25, 100, 65];let result = largest(&number_list);println!("The largest number is {}", result);let char_list = vec!['y', 'm', 'a', 'q'];let result = largest(&char_list);println!("The largest char is {}", result);
}

泛型結構體

struct Point<T> {x: T,y: T,
}impl<T> Point<T> {fn new(x: T, y: T) -> Self {Self { x, y }}
}fn main() {let integer_point = Point::new(5, 10);let float_point = Point::new(1.0, 4.0);println!("Integer Point: ({}, {})", integer_point.x, integer_point.y);println!("Float Point: ({}, {})", float_point.x, float_point.y);
}

閉包和迭代器

閉包

閉包是可以捕獲其環境的匿名函數。Rust中的閉包可以存儲在變量中,作為參數傳遞給函數等。

fn main() {let add_one = |x: i32| -> i32 { x + 1 };let result = add_one(5);println!("Result: {}", result);let mut x = 5;let mut add_to_x = |y: i32| {x += y;};add_to_x(10);println!("x: {}", x);
}

迭代器

迭代器用于在集合上進行迭代操作。Rust中的迭代器具有惰性,即只有在需要時才會執行。

fn main() {let v1 = vec![1, 2, 3];let v1_iter = v1.iter();for val in v1_iter {println!("Got: {}", val);}let v2: Vec<i32> = v1.iter().map(|x| x + 1).collect();println!("Transformed vector: {:?}", v2);
}

異步編程

Rust通過async和await關鍵字支持異步編程,使得編寫并發代碼變得更加容易。

use tokio::time::{sleep, Duration};async fn do_something() {println!("Doing something...");sleep(Duration::from_secs(2)).await;println!("Done!");
}#[tokio::main]
async fn main() {let future1 = do_something();let future2 = do_something();tokio::join!(future1, future2);
}

宏是用于生成代碼的強大工具。Rust有兩種主要的宏:聲明宏(macro_rules!)和過程宏。

聲明宏

macro_rules! say_hello {() => {println!("Hello!");};
}fn main() {say_hello!();
}

過程宏

過程宏通常用于自定義屬性和派生。

use proc_macro::TokenStream;#[proc_macro]
pub fn my_macro(input: TokenStream) -> TokenStream {let input_str = input.to_string();format!("fn generated_fn() {{ println!(\"{}\"); }}", input_str).parse().unwrap()
}

Unsafe代碼

Rust默認是安全的,但有時需要進行低級操作,這時可以使用unsafe代碼塊。

fn main() {let mut num = 5;let r1 = &num as *const i32;let r2 = &mut num as *mut i32;unsafe {println!("r1: {}", *r1);println!("r2: {}", *r2);}
}

FFI(外部函數接口)

Rust可以與其他語言(如C)進行互操作,這通常通過FFI實現。

調用C代碼

extern "C" {fn abs(input: i32) -> i32;
}fn main() {unsafe {println!("Absolute value of -3 according to C: {}", abs(-3));}
}

設計模式

Rust也支持常見的設計模式,如單例模式、觀察者模式等。

單例模式

use std::sync::{Arc, Mutex};
use std::thread;struct Singleton {value: i32,
}impl Singleton {fn instance() -> Arc<Mutex<Self>> {static mut SINGLETON: Option<Arc<Mutex<Singleton>>> = None;unsafe {SINGLETON.get_or_insert_with(|| {Arc::new(Mutex::new(Singleton { value: 0 }))}).clone()}}
}fn main() {let singleton = Singleton::instance();{let mut singleton = singleton.lock().unwrap();singleton.value = 42;}let singleton = Singleton::instance();println!("Singleton value: {}", singleton.lock().unwrap().value);
}

性能優化

Rust的性能優化包括使用內聯、減少內存分配和使用高效的數據結構等。

內聯函數

#[inline]
fn add(x: i32, y: i32) -> i32 {x + y
}fn main() {let result = add(5, 10);println!("Result: {}", result);
}

使用高效的數據結構

use std::collections::HashMap;fn main() {let mut map = HashMap::new();map.insert("key1", 10);map.insert("key2", 20);println!("Value for 'key1': {}", map.get("key1").unwrap());
}

案例分析

通過一個簡單的Web服務器項目來綜合應用所學知識。

項目結構

simple_web_server
├── Cargo.toml
└── src├── main.rs└── lib.rs

代碼實現

Cargo.toml
[package]
name = "simple_web_server"
version = "0.1.0"
edition = "2018"[dependencies]
tokio = { version = "1", features = ["full"] }
hyper = "0.14"
src/lib.rs
use hyper::service::{make_service_fn, service_fn};
use hyper::{Body, Request, Response, Server};
use std::convert::Infallible;
use std::net::SocketAddr;async fn handle_request(_req: Request<Body>) -> Result<Response<Body>, Infallible> {Ok(Response::new(Body::from("Hello, World!")))
}pub async fn run() {let addr = SocketAddr::from(([127, 0, 0, 1], 8080));let make_svc = make_service_fn(|_conn| {async { Ok::<_, Infallible>(service_fn(handle_request)) }});let server = Server::bind(&addr).serve(make_svc);if let Err(e) = server.await {eprintln!("Server error: {}", e);}
}
src/main.rs
#[tokio::main]
async fn main() {simple_web_server::run().await;
}

運行項目

cargo run

訪問 http://127.0.0.1:8080,您將看到“Hello, World!”的響應。

以上就是Rust的進階教程,通過學習這些內容,您將能夠更好地掌握Rust并開發出更復雜和高效的應用程序。

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

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

相關文章

pdf怎么拆分成一頁一頁?4種拆分方法分享

在日常的辦公學習中&#xff0c;PDF文檔因其跨平臺、易閱讀、不易篡改等特性&#xff0c;成為我們工作和學習中不可或缺的一部分。然而&#xff0c;當我們需要對PDF進行編輯、打印或分享時&#xff0c;有時需要將整個PDF文檔拆分成一頁一頁的單獨文件。那么&#xff0c;如何高效…

深入理解Vue生命周期鉤子函數

深入理解Vue生命周期鉤子函數 Vue.js 是一款流行的前端框架&#xff0c;通過其強大的響應式數據綁定和組件化的開發方式&#xff0c;使得前端開發變得更加簡單和高效。在Vue應用中&#xff0c;每個組件都有其生命周期&#xff0c;這些生命周期鉤子函數允許開發者在不同階段執行…

2024 AIGC 技術創新應用研討會暨數字造型設計師高級研修班通知

尊敬的老師、領導您好! 為深入響應國家關于教育綜合改革的戰略部署&#xff0c;深化職業教育、高等教育改革&#xff0c;發揮企業主體重要作用&#xff0c;促進人才培養供給側和產業需求側結構要素全方位融合&#xff0c;充分把握人工智能創意式生成(AIGC)技術在教育領域的發展…

【ruoyi】docker 項目實戰

一、引言 介紹ruoyi(若依)框架 本項目使用若依前后臺分離框架 https://gitee.com/ranmaxli/basic-business-platform 解釋為什么選擇Docker進行項目開發 使用docker是因為方便數據遷移、部署、管理 二、Docker基礎知識 Docker基本概念 容器與虛擬機

初學Spring之 IOC 控制反轉

Spring 是一個輕量級的控制反轉&#xff08;IOC&#xff09;和面向切面編程&#xff08;AOP&#xff09;的框架 導入 jar 包&#xff1a;spring-webmvc、spring-jdbc <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc&l…

HTTPS數字證書驗證論述

1 概述 網絡請求方式通常分為兩種&#xff0c;分別是HTTP請求和HTTPS請求&#xff0c;其中HTTP的傳輸屬于明文傳輸&#xff0c;在傳輸的過程中容易被人截取并且偷窺其中的內容&#xff0c;而HTTPS是一種在HTTP的基礎上加了SSL/TLS層&#xff08;安全套接層&#xff09;的安全的…

解決expand-change第一次展開無數據顯示與實現

最近寫需求時用到了expand-change表格展開回調&#xff0c;但我發現第一次展開后并沒有展示任何數據&#xff0c;但我的返回值是存在的&#xff0c;當第二次展開時發現數據就有了。此原因是因為獲取數據的接口是異步的&#xff0c;導致Dom渲染不同步導致的&#xff0c;其實解決…

Ubuntu24.04 Isaacgym的安裝

教程1 教程2 教程3 1.下載壓縮包 link 2. 解壓 tar -xvf IsaacGym_Preview_4_Package.tar.gz核心教程在 isaacgym/docs/install.html下 3. 從源碼安裝 Ubuntu24.04還需首先進入虛擬環境 python -m venv myenv # 創建虛擬環境&#xff0c;已有可跳過 source myenv/bin/a…

Redis持久化詳解

【關閉文件、AOF 刷盤、釋放內存這三個任務都有各自的任務隊列】所以不是單線程 Redis有兩種持久化方案&#xff1a; RDB持久化 AOF持久化 基于Redis集群解決單機Redis存在的問題 【Redis是單進程的】 【也有人做分布式section】 【主從集群中多個從就是做負載均衡的】 …

如何在Java中實現函數式編程

如何在Java中實現函數式編程 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在Java中&#xff0c;函數式編程是一種編程范式&#xff0c;它將計算視為數學函數…

在Linux系統中查找并計數正在運行的ffmpeg進程數量

ps aux | grep "ffmpeg" | grep -v "grep" | wc -l 這條命令是一個組合命令&#xff0c;用于在Linux系統中查找并計數正在運行的ffmpeg進程數量&#xff0c;同時排除了搜索命令本身&#xff08;即grep "ffmpeg"&#xff09;的干擾。下面是對每個…

Java識別圖片中的二維碼

引入依賴 <dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.5.10</version> </dependency><dependency><groupId>org.bytedeco</groupId><artifactId>javacp…

while陳述

回圈是用來進行進行重復性的工作&#xff0c;典型的回圈會進行下列三項基本任務 1. 控制變數初始設定2. 回圈結束條件測試3. 調整控制變數的值 關鍵字 while構成C 中回圈的一種&#xff0c;常用于沒有確定重復次數的回圈&#xff0c;同時while后面接著小括弧為回圈結束的條件…

上位機第二彈

之前寫的代碼用上了 現在想想 &#xff0c;北向一側還挺難搞&#xff0c;設計很巧妙

Continual Test-Time Domain Adaptation--論文筆記

論文筆記 資料 1.代碼地址 https://github.com/qinenergy/cotta 2.論文地址 https://arxiv.org/abs/2203.13591 3.數據集地址 論文摘要的翻譯 TTA的目的是在不使用任何源數據的情況下&#xff0c;將源預先訓練的模型適應到目標域。現有的工作主要考慮目標域是靜態的情況…

python - 列表 / 元組 / 字符串

一.列表 由于pyhon的變量沒有數據類型&#xff0c;所以python是沒有數組的&#xff08;因為數組只能存放一種類型&#xff0c;要么全部存放整型&#xff0c;要么全部存放浮點型&#xff09;&#xff0c;只有列表list&#xff0c;所以整數&#xff0c;浮點數&#xff0c;字符串…

傳輸線阻抗匹配電阻端接的方式

電路為什么需要端接&#xff1f; 眾所周知&#xff0c;電路中如果阻抗不連續&#xff0c;就會造成信號的反射&#xff0c;引起上沖下沖、振鈴等信號失真&#xff0c;嚴重影響信號質量。所以在進行電路設計的時候阻抗匹配是很重要的考慮因素。 對我們的PCB走線進行阻抗控制已經…

雙指針系列第 8 篇:盛水最多的容器。幾句話講明白!

Leetcode 題目鏈接 思路 取首尾雙指針和水量如下所示&#xff0c;設高度函數為 h ( i ) h(i) h(i)&#xff0c;在下圖中 h ( l ) < h ( r ) h(l) < h(r) h(l)<h(r)。 觀察以 l l l 為左邊界所能構成的其他水量&#xff0c;與矮的右邊界搭配結果如下。 與高的…

jdk17卸載后換jdk1.8遇到的問題

過程&#xff1a; 1、找到jdk17所在文件夾&#xff0c;將文件夾進行刪除。&#xff08;問題就源于此&#xff0c;因為沒刪干凈&#xff09; 2、正常下載jdk1.8&#xff0c;按照網上步驟配置環境變量&#xff0c;這里我參考的文章是&#xff1a; http://t.csdnimg.cn/Svblk …

【RT摩拳擦掌】如何構建RT AVB switchendpoint平臺

【RT摩拳擦掌】如何構建RT AVB switch&endpoint平臺 一&#xff0c;文檔簡介二&#xff0c;平臺構建2.1 軟硬件情況2.2 配置RT1170 AVB端點2.2.1 1塊MIMXRT1170開發板做talker配置2.2.2 2塊MIMXRT1170開發板做listener配置 2.3 AVB Switch 配置2.3.1 MOTU AVB Switch2.3.2 …