Rust中的Copy和Clone

来源:https://www.cnblogs.com/liujin-now/archive/2023/04/22/17342323.html
-Advertisement-
Play Games

1 腐蝕操作 用於圖片的去毛刺,內容削減 1 #腐蝕操作 2 #cv2.erode(src,kernel,iterations) 3 #src是圖片數字化數組 4 #kernel則是一個盒,對該盒內的像素進行覆試操作,值越小腐蝕能力越狠 5 #iterations是一個迭代次數,就是說你對這個圖片進 ...


1.Copy和Clone

Rust中的CopyClonetrait都允許創建類型實例的副本。它們都提供了一種複製類型實例的方法,但它們之間存在一些重要的區別。瞭解這些區別有助更好地使用這兩個特征。

2. Copytrait

Copytrait允許按位複製類型的實例。這意味著當您將一個變數賦值給另一個變數時,如果該類型實現了Copytrait,則會創建一個新的副本。這與移動語義不同,其中原始變數不再可用。

要使用derive屬性為類型自動生成Copytrait的實現,只需在類型定義之前添加#[derive(Copy)]即可。例如:

#[derive(Copy)]
struct Point {
    x: i32,
    y: i32,
}
複製代碼

請註意,並非所有類型都可以實現Copytrait。例如,具有堆分配欄位(如StringVec<T>)的類型不能實現Copy

3. Clonetrait

與之相反,Clonetrait提供了一個clone方法,用於創建類型實例的深層副本。這意味著即使類型具有堆分配欄位(如StringVec<T>),也可以實現Clonetrait。

要為類型自動生成Clonetrait的實現,只需在類型定義之前添加#[derive(Clone)]即可。例如:

#[derive(Clone)]
struct Point {
    x: i32,
    y: i32,
}
複製代碼

但是,並非所有類型都可以使用derive屬性自動生成Clonetrait的實現。如果類型的某些欄位沒有實現

4. CopyClonetrait之間的區別

儘管CopyClonetrait都允許您創建類型實例的副本,但它們之間存在一些重要的區別。

首先,當您使用賦值語句複製一個實現了Copytrait的類型時,複製操作是隱式執行的。而當您使用clone方法複製一個實現了Clonetrait的類型時,複製操作是顯式執行的。 例如:

#[derive(Copy)]
struct Point {
    x: i32,
    y: i32,
}
fn main() {
let p1 = Point { x: 1, y: 2 };
let p2 = p1
assert_eq!(p1.x, p2.x);
assert_eq!(p1.y, p2.y); 
}
複製代碼
#[derive(Clone)]
struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let p1 = Point { x: 1, y: 2 };
    let p2 = p1.clone();
    assert_eq!(p1.x, p2.x);
    assert_eq!(p1.y, p2.y);
}
複製代碼

此外,這兩個trait分別適用於不同的場景。對於那些具有簡單按位複製語義的類型(如標量類型和由它們組成的數組和元組),使用Copytrait更為方便。而對於那些需要執行深層複製操作的類型(如具有堆分配欄位的類型),則應使用Clonetrait。from劉金,轉載請註明原文鏈接。感謝!

 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用.env加尾碼的方式來建立某個模式下的環境變數, 例如:項目根目錄新建兩個環境變數文件(development開發環境和production生產環境): .env.development .env.production 在新建的兩個環境變數文件中設置相同的環境變數名: VUE_APP_BASE_ ...
  • 一、簡單瞭解JS 1. JavaScript(簡稱JS)是作為開發Web頁面的腳本語言。 2. JS是從1995年由網景公司的布蘭德開發。 3. JavaScript的標準是ECMAScript。 4. JS代碼是從上往下執行的。 二、變數 1. 變數名的值可以重覆賦值(值可以修改),變數可以重覆聲 ...
  • HTML input type="number" 隱藏預設的步進箭頭 number 類型的 <input> 元素用於讓用戶輸入一個數字,其包括內置驗證以拒絕非數字輸入。 瀏覽器可能會選擇提供步進箭頭,讓用戶可以使用滑鼠增加和減少輸入的值,或者只需用指尖敲擊即可。但有些場景需要隱藏預設的步進箭頭。 要 ...
  • devServer 是一個用於配置開發伺服器的選項對象。它可以用來配置伺服器的各種選項,例如代理,埠號,HTTPS 等。 以下是一些常用的 devServer 參數和設置: port:指定開發伺服器的埠號,預設為 8080。 host:指定開發伺服器的主機名,預設為 localhost。 htt ...
  • 我們設計目前的門戶基座,可以快速瀏覽各個平臺,同時串聯數據開發與管理的工作,減少用戶的試錯成本,提升工作效率。 ...
  • 可以將Axios攔截器封裝成一個單獨的request文件,以便在整個應用程式中重覆使用。 以下是一個示例,展示如何將Axios攔截器封裝成一個request文件: 1、創建一個名為request.js的新文件,並導入Axios: import axios from 'axios'; 2、創建一個名為 ...
  • 簡介 觀察者模式(Observer Pattern)是一種行為型模式。它定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。 觀察者模式使用三個類Subject、Observer和Client。Subject對象帶有綁定觀察者到Client對象和從 ...
  • 本文首發於公眾號:Hunter後端 原文鏈接:Django筆記二十七之資料庫函數之文本函數 這篇筆記將介紹如何使用資料庫函數里的文本函數。 顧名思義,文本函數,就是針對文本欄位進行操作的函數,如下是目錄彙總: Concat() —— 合併 Left() —— 從左邊開始截取 Length() —— ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...