趣味學Rust基礎篇(變量與可變性)

這篇文章將用通俗的比喻和清晰的邏輯,帶你深入理解 Rust 變量背后的核心思想,讓你不僅“會用”,更能“明白為什么”。

Rust 的“盒子哲學”:變量、可變性、常量與隱藏

想象一下,Rust 里的變量就像一個個盒子。你把值(比如數字、文字)裝進盒子里,然后給盒子貼上標簽(變量名),以后就能通過標簽找到盒子里的東西了。但 Rust 對這些盒子的管理非常嚴格,這正是它安全、高效的核心所在。讓我們來看看 Rust 的“盒子管理規則”。

規則一:盒子默認是“上鎖”的(不可變性)

在 Rust 世界里,當你創建一個盒子時,它默認是上鎖的,這意味著你一旦把東西放進去,就不能再改變了!這聽起來有點“死板”?但其實這非常聰明!

為什么上鎖是好事?

想象一下,你和朋友合伙開公司,你們約定好“公司注冊資本是 100 萬”。如果這個數字可以隨意修改,那會出大問題!今天改 200 萬,明天改 50 萬,賬就亂了。

在編程中也一樣。如果一個值(比如“最大玩家數量”)被標記為不可變,整個程序的其他部分都可以放心地認為它不會變。這避免了“我這里以為是 100,你那里偷偷改成了 200”這種難以追蹤的 bug。

試試看:

fn main() {let x = 5; // 創建一個叫 x 的盒子,放進去數字 5,并上鎖。println!("x 的值是:{x}");x = 6;     // 試圖把 6 放進去?不行!盒子上鎖了!println!("x 的值是:{x}");
}

運行這段代碼,Rust 編譯器會立刻跳出來大喊:“錯誤!你不能給一個上鎖的盒子(不可變變量 x)重新賦值!” 它甚至會貼心地告訴你:“嘿,如果你真的想讓它能變,試試加個 mut 吧!”

規則二:想改?請先“解鎖”(可變性 mut

如果你確實需要一個能隨時修改的盒子,Rust 允許你“解鎖”,但必須明確地申請。方法就是用 mut 關鍵字。

fn main() {let mut x = 5; // 創建一個叫 x 的盒子,放進去 5,但這次是“可解鎖”的!println!("x 的值是:{x}");x = 6;         // 現在可以了!把 5 換成 6。println!("x 的值是:{x}");
}

mut 的深層意義:

  1. 安全:強制你思考“這個值真的需要改變嗎?” 大多數情況下,值不需要變,上鎖更安全。
  2. 溝通mut 就像一個醒目的標簽,告訴其他程序員(包括未來的你):“注意!這個 x 的值可能會在代碼后面被修改!” 這讓代碼更容易理解和維護。

核心思想默認不可變,需要可變時才用 mut。這是 Rust 安全性的基石。

規則三:永不改變的“金盒子”(常量 const

有時候,你有一些值是“鐵律”,絕對、絕對、絕對不能變,比如“一小時有 3600 秒”。對于這種值,Rust 有更高級的“金盒子”——常量

const SECONDS_IN_HOUR: u32 = 60 * 60;

常量 vs 普通變量:

特性普通變量 (let)常量 (const)
可變性默認不可變,加 mut 可變永遠不可變,不能加 mut
聲明位置通常在函數內可以在任何地方,包括全局(整個程序都能用)
值來源可以是運行時計算的結果(如用戶輸入)只能是編譯時就能算出來的值(常量表達式)
命名習慣snake_case(小寫下劃線)SCREAMING_SNAKE_CASE(全大寫下劃線)

為什么常量只能是編譯時的值?

因為常量是在程序啟動前就確定的。它不能依賴于運行時才能知道的東西,比如用戶輸入或網絡請求的結果。60 * 60 在編譯時就能算出是 3600,所以沒問題。

核心思想:常量是程序的“硬編碼規則”,安全、高效、作用域廣。


規則四:盒子的“變身術”(隱藏 Shadowing

這是 Rust 一個非常酷的特性!想象一下,你有一個叫 spaces 的盒子,里面裝著一串空格 " "。現在,你不想知道空格本身,而想知道它有多長(3個字符)。你不想創建一個新名字(比如 spaces_length),怎么辦?

Rust 允許你用同一個名字重新聲明一個新盒子,這個新盒子會“隱藏”(Shadow)掉舊的盒子。舊盒子依然存在,但你再也“看不見”它了,只能看到新的。

fn main() {let spaces = "   "; // 第一個 spaces 盒子,裝著字符串 "   "let spaces = spaces.len(); // 變!用同名新盒子,裝著舊盒子的長度 3println!("spaces 的值是:{spaces}"); // 打印出來是 3
}

隱藏 vs mut:關鍵區別!

  1. 改變類型

    • 隱藏:可以!第一個 spaces字符串,第二個 spaces數字。類型變了!
    • mut不行! 一旦盒子類型定下來(比如 let mut x = 5;i32),就不能再改成其他類型。
    fn main() {let mut spaces = "   "; // spaces 是字符串類型spaces = spaces.len(); //  錯誤!你不能把一個數字塞進一個聲明為字符串的盒子!
    }
    
  2. 安全性

    • 隱藏:每次都是創建一個全新的盒子。舊盒子被隱藏,但不會被意外修改。
    • mut:是同一個盒子,里面的值被直接修改。如果多處代碼都 mut 同一個變量,容易出錯。
  3. 重置可變性

    • 隱藏:你可以“先 mut 后隱藏為不可變”。比如,先創建一個 mut 盒子進行一系列計算,最后用 let 隱藏它,使其變為不可變,后續代碼就安全了。

核心思想:隱藏是“創建新身份”,mut 是“修改舊身份”。隱藏更靈活(能改類型),且在轉換完成后能回歸不可變的安全狀態。

總結:Rust 變量的“四大法寶”

通過這四個規則,Rust 構建了一套強大的內存和數據管理機制:

  1. let (不可變)默認安全。盒子上鎖,防止意外修改。
  2. let mut (可變)明確授權。需要修改時才解鎖,且明確告知他人。
  3. const (常量)全局鐵律。編譯時確定,永不改變,作用域廣。
  4. let (隱藏)靈活轉換。同名換新盒,可改類型,轉換后回歸安全。

這些規則共同作用,讓 Rust 程序在編譯時就能捕獲大量潛在的錯誤(比如數據競爭、空指針、類型錯誤),而無需犧牲運行時性能。這就是 Rust “零成本抽象”和“內存安全”的精髓所在。

現在,你已經理解了 Rust 變量背后的核心哲學。

記住:Rust 不是限制你,而是通過嚴格的規則,幫你寫出更可靠、更高效的代碼。 繼續探索吧!

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

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

相關文章

2025年- H100-Lc208--912.排序數組(快速選擇排序)--Java版

1.題目2.思路 快速選擇排序的平均時間復雜度是O(nlogn),最壞時間復雜度是O(n^2),最好的時間復雜度是O(nlogn),空間復雜度是O(nlogn)。 排序算法中…

解決 pdf.mjs 因 MIME 類型錯誤導致的模塊加載失敗問題

Mozilla PDF.js V4 開始,它官方分發確實只提供了 ESM 模塊(.mjs),沒有以前的 pdf.js、pdf.worker.js UMD 版本了。 這個問題本質上是 瀏覽器要求以 application/javascript MIME 類型加載 ES Module,而你引入的 pdf.mj…

STM32八大模式

前言:STM32存在八大模式,分別如下推挽輸出,開漏輸出,復用推挽輸出,復用開漏輸出浮空輸入,上拉輸入,下拉輸入,模擬輸入STM32標準IO結構圖如下:其中如下電路為保護電路&…

OpenCV4.X庫功能全解---個人筆記

文章目錄前言1.Core核心功能1.1 基本數據類型和結構:1.2 數組操作:1.3 數學函數:1.4 隨機數生成:1.5 線性代數運算:1.6 常用數據結構和算法:1.7 XML/YAML文件讀寫:1.8 錯誤處理:1.9時…

代碼隨想錄刷題Day44

二叉搜索樹的最近公共祖先 這道題,可以沿用二叉樹的最近公共祖先的求法進行求解,也就是root判斷-左右子樹遞歸求LCA-根據左右子樹的LCA結果返回值這一套。 但是,如果要用上搜索二叉樹的有序性這個信息的話,就可以直接在遞歸時候確…

springmvc的數據校驗和處理的一個例子

JSR-303是Java 的標準規范,而 Spring MVC 對其提供了完美的支持和集成 1.JSR-303 的身份 JSR-303 是 Java 標準 JSR:Java Specification Request(Java 規范請求) JSR-303:Bean Validation 1.0(Bean 驗證規范…

SlowFast使用指南(三)——自建數據集

寫在前面 在前兩個章節初步使用了SlowFast,使用的都是官方給出的數據集。 附上鏈接: SlowFast使用指南(一)——demo運行-CSDN博客 SlowFast使用指南(二)——訓練ava數據集-CSDN博客 本文嘗試了使用自己的數…

Day26 樹的層序遍歷 哈希表 排序算法 內核鏈表

day26 樹的層序遍歷 哈希表 排序算法 內核鏈表 實現樹的層序遍歷(廣度遍歷) 使用隊列輔助實現二叉樹的層序遍歷。算法核心思想是:從根節點開始,依次將每一層的節點入隊,出隊時訪問該節點,并將其左右子節點&…

【系統分析師】高分論文:論快速應用開發方法及應用

【摘要】 我在某縣衛生健康委員會公共衛生信息中心工作,是信息中心的負責人。2021年5月,我中心受縣瘓病預防控制中心委托,為某種瘓病疫苗3期臨床項日開發受試對象攔截系統。我負責系統架構設計、需求分析以及后期的部分編碼工作。通過與慶病預…

4056:【GESP2403八級】接竹竿

/*4056:【GESP2403八級】接竹竿flag 數組 存儲每個元素出現的位置,nxt[i]j;存儲每個位置 后面第一次出現 與a【i】相等的位置//其中 a【i]a[j] :記錄i的下一個位置 ,flag 存儲每個值的位置下一次 具有下一次,相當于的鏈表了&…

企業落地版 AutoGen 多智能體工程(完整示例)

企業生產級參考實現,目標是一套可直接部署的模板工程,包含: FastAPI HTTP API(任務提交、狀態查詢) Celery 異步任務隊列(Redis Broker) PostgreSQL + pgvector(向量存儲,RAG) SQLAlchemy + Alembic(ORM 與遷移) AutoGen 多智能體編排(Planner / Coder / Executor…

前端的請求協議對應java的接收

application/json前端發送 JSON 數據,后端用 RequestBody 接收并自動映射為 Java 對象。前端示例(Axios):axios.post("/api/user", { name: "張三", age: 20 }, {headers: { "Content-Type": "…

esp32_hid_device 調試遇到的一些問題

nimble to windows10 22h2esp_hid_device 的keyboardReportMap在win10 22h2 csr4.0 下好像識別不了, Windows(和大多數 BIOS/UEFI)只認 6-byte key array 的 HID Keyboard 描述符。如果不是 6 個字節,Windows HID 驅動就會認為這不…

觀察者模式 (Observer Pattern)與幾個C++應用例子

1. 模式定義與核心思想 觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。當這個主題對象的狀態發生變化時,它會自動通知所有觀察者對象,使它們能夠自動更新自己。核心思想: 解耦主題和觀察者。主題…

[系統架構設計師]論文(二十三)

[系統架構設計師]論文(二十三) 一.論軟件系統架構評估 1.架構所關注的質量屬性主要有:性能,可用性,安全性,可修改性 1)性能。性能是指系統的響應能力,即要經過多長時間才能對某個事件…

攻克 Java 分布式難題:并發模型優化與分布式事務處理實戰指南

攻克 Java 分布式難題:并發模型優化與分布式事務處理實戰指南 開場:從“搖搖欲墜”到“穩如磐石”,你的分布式系統進階之路 你是否曾經遇到過這樣的場景?精心打造的電商應用,在大促開啟的瞬間,頁面響應變得…

如何在Ubuntu中刪除或修改已有的IP地址設置?

在 Ubuntu 中為新增加的網卡設置網絡時,需要區分原有網卡和新網卡的配置,確保它們可以獨立工作(可在同一網段或不同網段)。以下是具體步驟,假設你需要為新網卡配置靜態 IP(以 192.168.1.190/24 為例&#x…

Ansible Playbook 概述與實踐案例(下)

#作者:張桐瑞 文章目錄四、條件判斷的實現五、循環的實現六、Jinja模板應用1、Jinja模板2、handlers組件七、角色 role1、角色介紹2、案例: 部署zabbix-agent四、條件判斷的實現 when: 條件 - hosts: appserveruser: roottasks:- name: create userAuser: nameuser…

LeetCode 100 -- Day6

1. 哈希:49、128(1)49 字母異位詞分組 -- 字典from collections import defaultdict class Solution(object):def groupAnagrams(self, strs):"""創建字典{sorted_string:原str}"""resultsdefaultd…

多因素認證(MFA/2FA)實戰指南:如何保護你的賬號

一、MFA/2FA 基礎認知 1. 概念辨析與演進 單因素認證(1FA)的局限性:僅依賴 “知識因素”(如密碼),據 2024 年 Verizon 數據泄露報告,81% 的賬戶入侵源于密碼泄露 —— 要么是用戶使用弱密碼&a…