學習筆記二十——Rust trait

🧩 Rust?Trait 徹底搞懂版

👀 目標讀者:對 Rust 完全陌生,但想真正明白 “Trait、Trait?Bound、孤島法則” 在做什么、怎么用、為什么這樣設計。
🛠 方法

  1. 先給“心里模型”——用生活類比把抽象概念掰開揉碎。
  2. 再給“最小代碼”——跑得動、改得動,看編譯器怎么說。
  3. 最后給“練習路線”——照著做,概念才能沉到肌肉里。

1?? Trait 的心里模型——“技能證書”

現實類比Rust 中的名字說明
駕駛證:上面寫可開貨車/小客車Trait“會干什么”的清單,只列方法簽名;沒有數據
司機甲類型 (struct / enum)真正扛活兒的人
給司機頒證impl Trait for Type表示 “甲已掌握駕駛技能”

三點記住:

  1. Trait 不存數據,只規定行為。
  2. 一個類型可以拿多本證書 → 組合能力。
  3. 證書頒發 (impl) 時才寫具體實現,編譯期 就定好函數體,零額外開銷。

2?? 最小可跑例子

trait SayHi {                       // 證書:會打招呼fn hi(&self);                   // 方法清單:打招呼
}struct Cat { name: String }         // 司機:貓impl SayHi for Cat {                // 頒證:貓會打招呼fn hi(&self) {                  // 具體實現println!("喵,我是 {}", self.name);}
}fn main() {let kitty = Cat { name: "Tom".into() };kitty.hi();                     // 輸出:喵,我是 Tom
}

3?? Trait?Bound 心里模型——“入場門票”

fn greet<T: SayHi>(v: &T) { v.hi(); }
  • 意思T 只有拿到 SayHi 證書 才能進場。
  • 寫法擴展T: SayHi + Clone → 同時要兩本證書;where 子句只是把字寫到下一行更清爽。

4?? PartialOrd + Copy 為何要一起寫?

證書能力largest 為啥要它
PartialOrd能比較大小 (>, <)得知道誰更大
Copy能按位復制,不搬所有權返回最大值時不挪走原數據

組合寫法 T: PartialOrd + Copy 就像門口貼“身高 1.6m 以上 年滿 18 歲才能進”。


5?? largest 函數剖面圖(完全自定義名字)

fn largest<T: PartialOrd + Copy>(list: &[T]) -> T {let mut max = list[0];          // Copy 允許拷貝for &item in list {if item > max { max = item; } // PartialOrd 允許比較}max
}

? 練習:把 Copy 去掉再編譯,看看錯誤提示,體會“證書缺了一本”的感覺。


6?? impl Trait vs dyn Trait:兩種“請師傅干活”的方式

問題impl Trait(靜態,一對一)dyn Trait(動態,一群人)
具體類型編譯期確定嗎?? 是? 否(需到運行期)
性能零額外開銷每次方法調用需 vtable 查表 + 跳轉
能否放不同類型一起?不能可以放進 Vec<Box<dyn Trait>>

7?? Marker Trait——沒有函數體的“隱形證書”

證書表示能力典型場景
Copy按位復制標量、小 struct
Send可以安全轉到別的線程thread::spawn 移動所有權
Sync多線程可安全共享 &T只讀全局配置
Unpin指針可被移動(異步 Pin 相關)自寫 Future
// 手動給自定義隊列證明線程安全
struct MyQueue<T>(std::sync::Mutex<Vec<T>>);
unsafe impl<T: Send> Send for MyQueue<T> {}
unsafe impl<T: Send> Sync for MyQueue<T> {}

8?? 孤島法則 (Orphan?Rule) ——“證書只能本島簽發”

先弄明白關鍵名詞
crate:Rust 的 “島” —— 一個編譯單元 / 包。

  • 你當前寫代碼的包 = 當前 crate
  • std = 標準庫 crate
  • serde, tokio 等 = 外部 crate

8.1 四類組合(官方規則,按“島”歸屬劃分)

組合Type 屬于Trait 屬于impl 嗎?口訣
① 當前 crate + 當前 crate本島本島?自己人給自己發證,隨便
外部 crate + 當前 crate外島本島?自家證書給外來人發
當前 crate + 外部 crate本島外島?外島證書發給自家人
④ 外部 crate + 外部 crate外島外島?“雙外來”禁止——怕撞車

你的說法 “當前 crate / Std / 外部 crate” 可以映射到表中:

  • 標準庫外部 crate(你改不了源)。
  • 只要落到 組合④(Type + Trait 都不歸你),就違規。

8.2 違反怎么辦?——Newtype Pattern

// 想給外部庫 FooType 實現外部庫 BarTrait,不允許
struct MyFoo(FooType);          // 包一層,本島 Type
impl BarTrait for MyFoo {}   // 現在是組合③,合法

9?? 徹底掌握 Trait 的三步練法

  1. 抄 & 跑
    • 復制本文示例,邊改邊看編譯器錯誤,尤其試著刪掉 Trait?Bound。
  2. 寫小工具
    • 寫個 Printable Trait,自定義三種類型實現;用 impl Trait 返回打印器。
  3. 讀官方文檔 &源碼
    • IteratorRead 這些經典 Trait 的代碼,再畫出“證書 → 司機”關系圖。

🔚 復盤一句話

Trait = 行為證書;Trait?Bound = 入場門票;孤島法則 = 證書只能在自己島簽發,雙外來禁止
把這三件事連起來,就能在寫泛型、并發、異步時游刃有余。祝練武順利!

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

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

相關文章

es 混合檢索多向量

在結合向量相似度檢索的同時,可以通過 bool 查詢的 filter 或 must 子句實現關鍵詞過濾。以下是一個同時包含 關鍵詞匹配 和 多向量相似度計算 的完整示例: 參考博文:ES集群多向量字段檢索及混合檢索方法-CSDN博客 示例:帶關鍵詞過濾的多向量聯合檢索 GET /my_index/_sea…

HTML5好看的水果蔬菜在線商城網站源碼系列模板4

文章目錄 1.設計來源1.1 主界面1.2 關于我們1.3 商品信息1.4 新聞資訊1.5 聯系我們1.5 登錄注冊 2.效果和源碼2.1 動態效果2.2 源代碼 源碼下載 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/147264262 HTML5好看的水果…

Kubernetes(k8s)學習筆記(二)--k8s 集群安裝

1、kubeadm kubeadm 是官方社區推出的一個用于快速部署 kubernetes 集群的工具。這個工具能通過兩條指令完成一個 kubernetes 集群的部署&#xff1a; 1.1 創建一個 Master 節點$ kubeadm init 1.2 將一個 Node 節點加入到當前集群中$ kubeadm join <Master 節點的 IP 和…

AI數據分析的優勢分析

隨著科技的飛速發展&#xff0c;人工智能&#xff08;AI&#xff09;已經深入滲透到數據分析領域&#xff0c;為各行各業帶來了前所未有的變革。AI數據分析作為一種新興的技術手段&#xff0c;通過運用機器學習、深度學習等算法對海量數據進行挖掘和分析&#xff0c;顯著提升了…

leetcode(01)森林中的兔子

今天開始記錄刷題的過程&#xff0c;每天記錄自己刷題的題目和自己的解法&#xff0c;歡迎朋友們給出更多更好的解法。 森林中的兔子 森林中有未知數量的兔子&#xff0c;提問其中若干只兔子“還有多少只兔子與你&#xff08;被提問的兔子&#xff09;顏色相同”。將答案收集到…

基于SpringBoot+Vue實現的旅游景點預約平臺功能一

一、前言介紹&#xff1a; 1.1 項目摘要 隨著人們生活水平的提高和休閑時間的增多&#xff0c;旅游已經成為人們生活中不可或缺的一部分。旅游業作為全球經濟的重要支柱&#xff0c;其發展趨勢呈現出數字化、網絡化和智能化的特點。傳統的旅游服務方式&#xff0c;如人工預約…

【支付】支付寶支付

下面為你詳細介紹使用 Spring Boot 對接支付寶支付&#xff0c;實現支付與退款功能的具體步驟和代碼示例。 添加依賴 在 pom.xml 里添加支付寶 SDK 依賴&#xff1a; <dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframewo…

shell 正則表達式與文本處理器

目錄 前言 一、正則表達式 &#xff08;一&#xff09;定義與用途 &#xff08;二&#xff09;基礎正則表達式 &#xff08;三&#xff09;基礎正則表達式元字符 &#xff08;四&#xff09;擴展正則表達式 二、文本處理器&#xff1a;Shell 編程的得力助手 &#xff0…

ASP.NET Core 最小 API:極簡開發,高效構建(上)

一、概述 構建最小 API&#xff0c;以創建具有最小依賴項的 HTTP API。 它們非常適合于需要在 ASP.NET Core 中僅包括最少文件、功能和依賴項的微服務和應用。 本文介紹使用 ASP.NET Core 生成最小 API 的基礎知識&#xff0c;將創建以下 API&#xff1a; API&#xff08;應用…

Apache Parquet 文件組織結構

簡要概述 Apache Parquet 是一個開源、列式存儲文件格式&#xff0c;最初由 Twitter 與 Cloudera 聯合開發&#xff0c;旨在提供高效的壓縮與編碼方案以支持大規模復雜數據的快速分析與處理。Parquet 文件采用分離式元數據設計 —— 在數據寫入完成后&#xff0c;再追加文件級…

IntelliJ IDEA 2025.1 發布 ,默認 K2 模式 | Android Studio 也將跟進

2025.1 版本已經發布&#xff0c;在此之前我們就聊過該版本的 《Terminal 又發布全新重構版本》&#xff0c;而現在 2025.1 中的 K2 模式也成為了默認選項。 可以預見&#xff0c;這個版本可能會包含不少大坑&#xff0c;為下個 Android Studio 祈禱。 首先有一點可以確定&…

云效部署實現Java項目自動化部署圖解

前言 記錄下使用云效部署Java項目&#xff0c;實現java項目一鍵化自動化部署。 云效流程說明&#xff1a; 1.云效拉取最新git代碼后 2.進行maven編譯打包后&#xff0c;上傳到指定服務器目錄 3.通過shell腳本&#xff0c;先kill java項目后&#xff0c;通過java -jar 啟動項…

國際數據加密算法(IDEA)詳解

以下是修正后的準確版本,已解決原文中的術語、符號及技術細節問題: ?國際數據加密算法(IDEA)? IDEA是一種分組加密算法,由Xuejia Lai(來學嘉)和James Massey于1990年設計。IDEA使用128位密鑰對64位明文分組進行加密,經過8輪迭代運算后生成64位密文分組。其安全性基于…

TensorFlow介紹

TensorFlow 是由 Google 開發 的開源機器學習框架&#xff0c;主要用于構建、訓練和部署機器學習模型。它支持深度學習、傳統機器學習和數值計算&#xff0c;適用于圖像識別、自然語言處理&#xff08;NLP&#xff09;、推薦系統、強化學習等多種任務。 核心特性 基于 數據流…

百級Function架構集成DeepSeek實踐:Go語言超大規模AI工具系統設計

一、百級Function系統的核心挑戰 1.1 代碼結構問題 代碼膨脹現象&#xff1a;單個文件超過2000行代碼路由邏輯復雜&#xff1a;巨型switch-case結構維護困難依賴管理失控&#xff1a;跨Function依賴難以追蹤 // 傳統實現方式的問題示例 switch functionName { case "fu…

嵌入式芯片中的 SRAM 內容細講

什么是 RAM&#xff1f; RAM 指的是“隨機存取”&#xff0c;意思是存儲單元都可以在相同的時間內被讀寫&#xff0c;和“順序訪問”&#xff08;如磁帶&#xff09;相對。 RAM 不等于 DRAM&#xff0c;而是一類統稱&#xff0c;包括 SRAM 和 DRAM 兩種主要類型。 靜態隨機存…

標準的JNI (Java Native Interface) 加載函數 JNI_OnLoad

1.JNI_OnLoad 在 Android Native 開發中&#xff0c;JNI_OnLoad 是動態注冊本地方法的標準入口點。以下是一個標準實現示例及其說明&#xff1a; JNI_OnLoad 標準實現 #include <jni.h> #include <string>// 聲明本地方法對應的 C/C 函數 jint native_add(JNIEnv…

算法導論思考題

2-1 在歸并排序中對小數組采用插入排序 c. 假定修改后的算法的最壞情況運行時間為 Θ \Theta Θ(nknlg(n/k))&#xff0c;要使修改后的算法與標準的歸并排序具有相同的運行時間&#xff0c;作為n的一個函數&#xff0c;借助 Θ \Theta Θ記號&#xff0c;k的最大值是什么&#…

JavaScript 性能優化

JavaScript 性能優化是提高 Web 應用性能的關鍵步驟,特別是在處理大量數據、復雜計算或頻繁的 DOM 操作時。以下是一些常見的 JavaScript 性能優化技巧和策略: 文章目錄 @[TOC]一、代碼層面優化1. **減少全局變量**2. **避免使用 `with` 語句**3. **使用局部變量**4. **減少 …

NLP高頻面試題(四十七)——探討Transformer中的注意力機制:MHA、MQA與GQA

MHA、MQA和GQA基本概念與區別 1. 多頭注意力(MHA) 多頭注意力(Multi-Head Attention,MHA)通過多個獨立的注意力頭同時處理信息,每個頭有各自的鍵(Key)、查詢(Query)和值(Value)。這種機制允許模型并行關注不同的子空間上下文信息,捕捉復雜的交互關系。然而,MHA…