Cangjie 中的值類型與引用類型

1. 值類型和引用類型
1.1 值的存儲方式

所有變量在底層實現中,都會關聯一個具體的“值”,這個值可能存儲在 內存地址 或 寄存器 中。

  • 寄存器用于優化常用變量的訪問速度。
  • 只有局部、小、頻繁使用的變量才更可能被分配到寄存器中。
  • 實際行為由編譯器根據上下文和優化策略決定。

對于值變量而言,這個關聯的值本身就是數據的直接表示。例如,一個 Int64 類型的變量 let x = 5 ,其關聯的值 5 直接存儲在變量的內存空間中,而非指向其他位置。

對于引用變量而言,其關聯的值是一個對對象的引用,該引用通常表現為對象在堆內存中的地址。變量本身并不包含對象的實際數據,而是通過這個引用間接訪問對象的內容。

在 Cangjie 語言中,class 和 Array / ArrayList / HashMap 等 collection 類型 屬于引用類型,struct 和 Int64 / String 等 基礎類型 屬于值類型。

1.2 let 在值類型與引用類型中的行為差異

引用類型 和 值類型 這種分類,直接影響了變量聲明(varlet)與方法調用的規則。

“let 與 var,分別對應不可變和可變屬性,可變性決定了變量被初始化后其值還能否改變,倉頡變量也由此分為不可變變量和可變變量兩類。”

  • 值類型特性:struct 實例的變量在聲明為 let 時是完全不可變的,包括其內部的字段;若需修改 struct 實例的狀態,則需使用 var 聲明變量,var d = Data()

  • 引用類型特性:引用類型實例的變量是引用(類似指針),let 聲明僅禁止重新賦值引用本身,但允許通過引用修改對象內部狀態。

let struct 與 let class 類似于 C++ 中常量指針常量(const T * const)和指針常量(T * const)的區別 —— 前者指向、指向的內容均不可變,后者指向不可變、指向的內容可變。

這也是為什么即使將 ArrayList 聲明為 let,依然可以向其中添加元素,因為 let 僅阻止對該引用本身的重新賦值,而不影響通過該引用修改對象內部狀態;

同樣地,let it = list.iterator() 可以在遍歷時通過 while (let Some(val) <- it.next()) 不斷獲取下一個元素,是因為迭代器對象的狀態變更屬于其內部行為,并不受引用本身不可變性的限制。

2. 復制和傳參的機制
2.1 復制行為解析

值類型變量的賦值或傳參會觸發深拷貝,即完整復制變量的相關數據,原始實例與副本狀態隔離;

引用類型變量的復制或傳參會復制引用(而非對象本身)。

Cangjie 值類型(struct)和引用類型(class)的復制均不會觸發構造函數:

  • struct 在賦值或傳參時,直接復制內存數據,不會調用構造函數、重新初始化成員變量。

在這里插入圖片描述

let d2= d1 的行為并不會調用 init(D: Data) 構造函數。因為 Cangjie 中結構體(struct)是值類型,賦值操作會直接復制內存中的數據,而不是通過構造函數進行初始化。
·
如果 Cangjie 在賦值時真的使用了自定義的拷貝構造函數(如 init(D: Data)),則會導致無限遞歸的問題:因為拷貝構造函數本身在初始化新對象時又會觸發一次賦值,進而再次調用拷貝構造函數,形成循環。
·
因此,這種“反向驗證”說明 Cangjie 在底層對值類型的賦值操作采用的是直接內存復制的方式,而不是依賴用戶定義的構造函數。

  • class 的實例通過引用來共享數據,賦值或傳參僅復制引用地址,無需構造新對象。
2.2 值類型中嵌套引用類型

當值類型(如 struct)中包含引用類型(如 ArrayList / class )時,復制值類型會導致以下行為:

  • 值類型字段:直接復制數據。修改副本的值類型字段,不影響原始實例。
  • 引用類型字段:復制引用地址。副本的引用類型字段與原始實例共享同一對象。

r1.x = 1 :因為 x 是值類型,賦值后修改的是 r2.x ,不影響 r1.x 。
r1.list: 1 2 3 :因為 list 是引用類型,r1.list 和 r2.list 指向同一個 ArrayList,所以 r2 對 list 的修改也影響到 r1 。

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

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

相關文章

使用el-input數字校驗,輸入漢字之后校驗取消不掉

先說說復現方式 本來input是只能輸入數字的&#xff0c;然后你不小心輸入了漢字&#xff0c;觸發校驗了&#xff0c;然后這時候&#xff0c;你發現校驗取消不掉了 就這樣了 咋辦啊&#xff0c;你一看校驗沒錯啊&#xff0c;各種number啥的也寫了,發現沒問題啊 <el-inputv…

使用 Zabbix 監控 MySQL 存儲空間和性能指標的完整實踐指南

目錄 引言 一、最終目標支持功能 二、監控方案設計 2.1 技術選型 2.2 設計思路 三、實現步驟 3.1 準備工作 3.11 創建 MySQL 監控賬號 3.12 配置 .my.cnf 文件 3.2 編寫統一腳本 3.3 配置 Zabbix Agent UserParameter 3.4 Zabbix 前端配置建議 四、總結 引言 MySQL …

多元素納米顆粒:開啟能源催化新紀元

在能源轉型的浪潮中&#xff0c;納米催化劑正成為推動能源技術突破的關鍵力量。多元素納米顆粒&#xff08;Polyelemental Nanoparticles&#xff09;憑借其獨特的元素協同效應&#xff0c;展現出在能源催化領域的巨大潛力。然而&#xff0c;合成這些復雜體系的納米顆粒面臨著諸…

鐵路行業數字化應用建設方案

數字化轉型面臨的挑戰 鐵路行業正處于數字化轉型的關鍵時期&#xff0c;鐵路行業應用場景復雜&#xff0c;數據量巨大&#xff0c;傳統信息化建設模式難以滿足日益增長的業務需求。鐵路企業亟需引入敏捷高效的數字化工具&#xff0c;加速推進業務創新&#xff0c;實現提質增效…

PlankAssembly 筆記 DeepWiki 正交視圖三維重建

manycore-research/PlankAssembly | DeepWiki PlankAssembly項目原理 這個項目是一個基于深度學習的3D重建系統&#xff0c;其核心原理是從三個正交視圖的工程圖紙中重建出3D形狀的結構化程序表示。 核心技術原理 1. 問題定義 PlankAssembly旨在從三個正交視圖的工程圖紙中…

分布式不同數據的一致性模型

1. 強一致性&#xff08;Strong Consistency&#xff09; 定義&#xff1a;所有節點在任何時間點看到的數據完全一致&#xff0c;讀操作總是返回最近的寫操作結果。特點&#xff1a; 寫操作完成后&#xff0c;所有后續讀操作都能立即看到更新。通常需要同步機制&#xff08;如…

C文件操作1

一、為什么使用文件 如果沒有文件&#xff0c;我們寫的程序的數據是存儲在電腦的內存中&#xff0c;如果程序退出&#xff0c;內存回收&#xff0c;數據就丟失 了&#xff0c;等再次運行程序&#xff0c;是看不到上次程序的數據的&#xff0c;如果要將數據進行持久化的保存&am…

Centos7.x內網環境Jenkins前端打包環境配置

Centos7.x內網環境Jenkins前端打包環境配置 參考地址&#xff1a; https://www.cnblogs.com/guangdelw/p/18763336 https://2048.csdn.net/682c1be8606a8318e857d687.html 前言&#xff1a;環境描述和目標 最近公司新接了一個項目&#xff0c;要求是&#xff1a;需要再桌面…

Hash 的工程優勢: port range 匹配

昨天和朋友聊到 “如何匹配一個 port range”&#xff0c;覺得挺有意思&#xff0c;簡單寫篇散文。 回想起十多年前&#xff0c;我移植并優化了 nf-HiPAC&#xff0c;當時還看不上 ipset hash&#xff0c;后來大約七八年前&#xff0c;我又舔 nftables&#xff0c;因為用它可直…

kafka學習筆記(三、消費者Consumer使用教程——使用實例及及核心流程源碼講解)

1.核心概念與架構 1.1.消費者與消費者組 Kafka消費者是訂閱主題&#xff08;Topic&#xff09;并拉取消息的客戶端實例&#xff0c;其核心邏輯通過KafkaConsumer類實現。消費者組&#xff08;Consumer Group&#xff09;是由多個邏輯關聯的消費者組成的集合。 核心規則 同一…

《java創世手記》---java基礎篇(下)

《Java 創世手記 - 基礎篇&#xff08;下&#xff09;》 第五章&#xff1a;契約與規范 —— 接口 (Interfaces) 與抽象類 (Abstract Classes) 造物主&#xff0c;在你日益繁榮的世界里&#xff0c;你發現僅僅依靠“繼承”來構建“物種體系”有時會遇到一些限制。比如&#x…

氣鎮閥是什么?

01、閥門介紹&#xff1a; 油封機械真空泵的壓縮室上開一小孔&#xff0c;并裝上調節閥&#xff0c;當打開閥并調節入氣量&#xff0c;轉子轉到某一位置&#xff0c;空氣就通過此孔摻入壓縮室以降低壓縮比&#xff0c;從而使大部分蒸汽不致凝結而和摻入的氣體一起被排除泵外起此…

計算機一次取數過程分析

計算機一次取數過程分析 1 取址過程 CPU由運算器和控制器組成&#xff0c;其中控制器中的程序計數器(PC)保存的是下一條指令的虛擬地址&#xff0c;經過內存管理單元(MMU)&#xff0c;將虛擬地址轉換為物理地址&#xff0c;之后交給主存地址寄存器(MAR)&#xff0c;從主存中取…

從equals思考對“正念”的認知

正念 很多人聊正念&#xff0c;每個人有自己的解說&#xff0c;我聽到最符合邏輯的一個說法&#xff1a;正念就是對抗慣性。 如果嘗試過打坐或者冥想&#xff0c;就有一個說法叫正觀&#xff0c;什么意義呢&#xff1f;就是說感受自己的呼吸&#xff0c;自己的心跳&#xff0c…

信息安全管理與評估2025山東卷

需要其他賽題解析的可聯系博主

【leetcode】02.07. 鏈表相交

鏈表相交 題目代碼1. 計算兩個鏈表的長度2. 雙指針 題目 02.07. 鏈表相交 給你兩個單鏈表的頭節點 headA 和 headB &#xff0c;請你找出并返回兩個單鏈表相交的起始節點。如果兩個鏈表沒有交點&#xff0c;返回 null 。 圖示兩個鏈表在節點 c1 開始相交&#xff1a; 代碼 …

可視化與動畫:構建沉浸式Vue應用的進階實踐

在現代Web應用中&#xff0c;高性能可視化和流暢動畫已成為提升用戶體驗的核心要素。本節將深入探索Vue生態中的可視化與動畫技術&#xff0c;分享專業級解決方案與最佳實踐。 一、 Canvas高性能渲染體系 01、Konva.js流程圖引擎深度優化 <template><div class"…

?模型驅動的DeepInsight Copilot在螞蟻的技術實踐

本文整理自潘蘭天&#xff08;螞蟻數據智能團隊數據分析平臺技術專家)在DA數智大會2025上海站的演講實錄。 本文圍繞AI技術在數據分析領域的應用及DeepInsight Copilot產品展開。DeepInsight是一款螞蟻長期深耕數據分析領域的BI產品&#xff0c;本文首先介紹了DeepInsight Copi…

Express教程【003】:Express獲取查詢參數

文章目錄 3、獲取URL中攜帶的查詢參數3.1 參數形式&#xff1a;查詢字符串3.2 參數形式&#xff1a;動態參數3.3 參數形式&#xff1a;Json數據 3、獲取URL中攜帶的查詢參數 3.1 參數形式&#xff1a;查詢字符串 1??通過req.query對象&#xff0c;可以訪問到客戶端通過查詢…

在CentOS7上使用tree查看目錄樹

文章目錄 1. 利用yum安裝tree2. 利用rpm安裝tree2.1 下載tree的rpm包2.2 上傳到云主機2.3 安裝tree軟件 3. 使用tree查看目錄樹4. 實戰小結 1. 利用yum安裝tree 執行命令&#xff1a;yum -y install tree CentOS7停止更新&#xff0c;即使更新鏡像源&#xff0c;也無法正常安裝…