復合 類型

字符串和切片

切片

切片的作用是允許你引用集合中部分連續的元素序列,而不是引用整個集合。

例如:

let s = String::from("hello world");let hello = &s[0..5];  // 切片 [0,5)  等效于&s[..5]
let world = &s[6..11];  // 切片 [6,11) 等效于&s[6..]
// 完整的s,&s[..]

注意,方括號中的數字是字節,如果字符是多字節的(如漢字),這時如果切片沒有落在兩個字符之間,程序就會崩潰(漢字是三個字節,切片0-2就會崩潰)

字符串的切片類型是 &str,i32數組的切片類型是 &[i32]

這樣一段代碼:let s = "Hello world!";, s 是個切片類型,實際上代碼為:let s: &str = "Hello world!"

字符串

Rust中字符是 Unicode 類型。內存占用 從1 - 4 個字節空間。

Rust中常用的字符串類型有 str / String,str硬編碼不可變,String可變。

// &str --> String
String::from("Hello world");
"hello world".to_string();// String --> &str
&s;

操作字符串

let mut s = String::from("Hello ");
// 追加字符串
s.push_str("rust");
// 追加字符
s.push('!');
// 插入字符
s.insert(5, ',');
// 插入字符串
s.insert_str(6, " I like");// 替換
// replace 適用于 String 和 &str,替換所有,返回一個新字符串,而不是操作原來的字符串
let new_string_replace = string_replace.replace("rust", "RUST");
// replacen 適用于 String 和 &str, 替換指定個數,返回一個新字符串,而不是操作原來的字符串
let new_string_replacen = string_replace.replacen("rust", "RUST", 1);
// replace_range 適用于 String,替換指定范圍字符串,操作原來的字符串
string_replace_range.replace_range(7..8, "R");// 刪除
// 均是操作原來的字符串
// pop 刪除并返回最后一個字符
let p1 = string_pop.pop();
// remove 刪除并返回指定位置字符
string_remove.remove(0);
// truncate 刪除指定位置到結尾
string_truncate.truncate(3);
// clear 清空字符串
string_clear.clear();// 連接
// + += ,右面必須是字符串的切片引用類型,相當于調用std::string add(),返回一個新字符串
let result = string_append + &string_rust;
// format! 
let s = format!("{} {}!", s1, s2);

遍歷字符串

// 以 unicode 字符方式遍歷字符串
for c in "中國人".chars() {println!("{}", c);
}

元組

元組是由多種類型組合到一起形成的,因此它是復合類型,元組的長度是固定的,元組中元素的順序也是固定的。

fn main() {let tup: (i32, f64, u8) = (500, 6.4, 1);
}

使用元組:

fn main() {let tup = (500, 6.4, 1);// 模式匹配let (x, y, z) = tup;println!("The value of y is: {}", y);// .let five_hundred = x.0;let six_point_four = x.1;// 函數let s1 = String::from("hello");let (s2, len) = calculate_length(s1);
}fn calculate_length(s: String) -> (String, usize) {let length = s.len(); // len() 返回字符串的長度(s, length)
}

結構體

使用

結構體的定義:

struct User {active: bool,username: String,email: String,sign_in_count: u64,
}

結構體的創建和使用:

// 每個都需要初始化,順序可以打亂
let mut user1 = User {email: String::from("someone@example.com"),username: String::from("someusername123"),active: true,sign_in_count: 1,
};// 訪問字段,
// **必須要將結構體實例聲明為可變的,才能修改其中的字段,Rust 不支持將某個結構體某個字段標記為可變。**
user1.email = String::from("anotheremail@example.com");// 簡化創建
fn build_user(email: String, username: String) -> User {User {email,username,active: true,sign_in_count: 1,}
}// 更新
let user2 = User {email: String::from("another@example.com"),..user1  // 注意 username 發生了所有權轉移,不能再被user1使用
};

內存排列

struct File {name: String,data: Vec<u8>,
}

內存結構:

元組結構體

元組結構體的字段沒有名稱:

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);

使用的使用可以直接用 x,y,z / r,g,b

單元結構體

單元結構體沒有任何字段和屬性

struct AlwaysEqual;let subject = AlwaysEqual;// 我們不關心 AlwaysEqual 的字段數據,只關心它的行為,因此將它聲明為單元結構體,然后再為它實現某個特征
impl SomeTrait for AlwaysEqual {}

結構體的所有權

如果你想在結構體中使用一個引用,就必須加上生命周期,否則就會報錯!

生命周期篇再寫。

打印

  • 使用 #[derive(Debug)] 來打印結構體信息。

    println!("{:?}",struct);

    dbg!(&struct);

  • 也可以實現 Display 特征打印信息(類似 toString() 方法)

    println!("{}",struct);

枚舉

使用:

可以向其他語言一樣直接使用,也可以為其關聯數據信息

// enum PokerSuit {
//   Clubs,
//   Spades,
//   Diamonds,
//   Hearts,
// }enum PokerCard {Clubs(u8),Spades(u8),Diamonds(u8),Hearts(u8),
}fn main() {let c1 = PokerCard::Spades(5);let c2 = PokerCard::Diamonds(13);
}

更為復雜的:

enum Message {Quit,Move { x: i32, y: i32 },Write(String),ChangeColor(i32, i32, i32),
}fn main() {let m1 = Message::Quit;let m2 = Message::Move{x:1,y:1};let m3 = Message::ChangeColor(255,255,0);
}

使用Option枚舉處理空值

在rust中使用Option枚舉來處理對象為空的情況(null):

enum Option<T> {Some(T),None,
}

使用的使用將值存入 Some<T> 中,這樣在使用變量的時候因為不能直接使用 Option,所以需要將值取出來再用。而取出來的時候需要判斷值不是Option::None才能用,相當于變相強制進行了判空操作,放置了空指針異常。

數組

在Rust中有兩種數組,一種是長度固定嗎,速度快的 array,一種是長度動態,性能較低的 vector。

array存儲在棧上,vector存儲在堆上。

array

使用:

fn main() {// 1.定義// let a: [i32; 5] = [1, 2, 3, 4, 5];  聲明類型let a = [1, 2, 3, 4, 5];// 重復:5個3let a = [3; 5]; // 非基礎元素// let array = [String::from("rust is good!"); 8];  ×  不能深拷貝let array: [String; 8] = std::array::from_fn(|i| String::from("rust is good!"));// 2.訪問let first = a[0]; // 獲取a數組第一個元素
}

數組切片

  • 創建切片的代價非常小,因為切片只是針對底層數組的一個引用
  • 切片類型[T]擁有不固定的大小,而切片引用類型&[T]則具有固定的大小,因為 Rust 很多時候都需要固定大小數據類型,因此&[T]更有用,&str字符串切片也同理
let a: [i32; 5] = [1, 2, 3, 4, 5];let slice: &[i32] = &a[1..3];  // 引用assert_eq!(slice, &[2, 3]);

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

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

相關文章

線性動態規劃入門之挖地雷

P2196 [NOIP1996 提高組] 挖地雷 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 這個題有點坑&#xff0c;就是說你只能往下挖&#xff0c;可以理解成單項路徑。比如1與3之間是1代表1可以到3而3不可以到1。所以我們來思考dp把。怎么寫&#xff1f;我們這么想假設1與2&#xf…

gitee上傳一個本地項目到一個空倉庫

gitee上傳一個本地項目到一個空倉庫 引入 比如&#xff0c;你現在本地下載了一個半成品的框架&#xff0c;現在想要把這個本地項目放到gitee的倉庫上&#xff0c;這時就需要我們來做到把這個本地項目上傳到gitee上了。 具體步驟 1. 登錄碼云 地址&#xff1a;https://gite…

【Pytroch】基于支持向量機算法的數據分類預測(Excel可直接替換數據)

【Pytroch】基于支持向量機算法的數據分類預測(Excel可直接替換數據) 1.模型原理2.數學公式3.文件結構4.Excel數據5.下載地址6.完整代碼7.運行結果1.模型原理 支持向量機(Support Vector Machine,SVM)是一種強大的監督學習算法,用于二分類和多分類問題。它的主要思想是找…

【數據結構】樹和二叉樹的概念及結構

1.樹概念及結構 1.1樹的概念 樹是一種非線性的數據結構&#xff0c;它是由n&#xff08;n>0&#xff09;個有限結點組成一個具有層次關系的集合。把它叫做樹是因為它看起來像一棵倒掛的樹&#xff0c;也就是說它是根朝上&#xff0c;而葉朝下的。 有一個特殊的結點&#…

Spring Boot 中的 AOP,到底是 JDK 動態代理還是 Cglib 動態代理

大家都知道&#xff0c;AOP 底層是動態代理&#xff0c;而 Java 中的動態代理有兩種實現方式&#xff1a; 基于 JDK 的動態代理 基于 Cglib 的動態代理 這兩者最大的區別在于基于 JDK 的動態代理需要被代理的對象有接口&#xff0c;而基于 Cglib 的動態代理并不需要被代理對…

list

目錄 迭代器 介紹 種類 本質 介紹 模擬實現 注意點 代碼 迭代器 介紹 在C中&#xff0c;迭代器&#xff08;Iterators&#xff09;是一種用于遍歷容器&#xff08;如數組、vector、list等&#xff09;中元素的工具 無論容器的具體實現細節如何,訪問容器中的元素的方…

在ubuntu中將dict.txt導入到數據庫sqlite3

將dict.txt導入到數據庫 #include <head.h> #include <sqlite3.h> int do_insert(int i,char *str,sqlite3 *db); int main(int argc, const char *argv[]) {//創建泵打開一個數據庫sqlite3 *db NULL;if(sqlite3_open("./my.db",&db) ! SQLITE_OK){…

【TI-CCS筆記】工程編譯配置 bin文件的編譯和生成 各種架構的Post-build配置匯總

【TI-CCS筆記】工程編譯配置 bin文件的編譯和生成 各種架構的Post-build配置匯總 TI編譯器分類 在CCS按照目錄下 有個名為${CG_TOOL_ROOT}的目錄 其下就是當前工程的編譯器 存放目錄為&#xff1a; C:\ti\ccs1240\ccs\tools\compiler按類型分為五種&#xff1a; ti-cgt-arm…

2023年排行前五的大規模語言模型(LLM)

2023年排行前五的大規模語言模型(LLM) 截至2023年&#xff0c;人工智能正在風靡全球。它已經成為熱門的討論話題&#xff0c;吸引了數百萬人的關注&#xff0c;不僅限于技術專家和研究人員&#xff0c;還包括來自不同背景的個人。人們對人工智能熱情高漲的原因之一是其在人類多…

CS5263替代停產IT6561連接DP轉HDMI音視頻轉換器ASL 集睿致遠CS5263設計電路原理圖

ASL集睿致遠CS5263是一款DP1.4到HDMI2.0b轉換器芯片&#xff0c;設計用于將DP1.4源連接到HDMI2.0b接收器。 CS5263功能特性&#xff1a; DP接口包括4條主通道、輔助通道和HPD信號。接收器支持每通道5.4Gbps&#xff08;HBR2&#xff09;數據速率。DP接收機結合了HDCP1.4和HDCP…

NVIDIA Omniverse與GPT-4結合生成3D內容

全球各行業對 3D 世界和虛擬環境的需求呈指數級增長。3D 工作流程是工業數字化的核心&#xff0c;開發實時模擬來測試和驗證自動駕駛車輛和機器人&#xff0c;操作數字孿生來優化工業制造&#xff0c;并為科學發現鋪平新的道路。 如今&#xff0c;3D 設計和世界構建仍然是高度…

C#的 Settings.Settings配置文件的使用方法

1、定義 在Settings.settings文件中定義配置字段。把作用范圍定義為&#xff1a;User則運行時可更改(用戶范圍的字段數據更改存儲在用戶信息中&#xff0c;不在該程序文件中)&#xff0c;Applicatiion則運行時不可更改。可以使用數據網格視圖(VS軟件的Properties 下面的Setting…

常見的Redux問題

在React中使用Redux的面試題目通常涵蓋了Redux的基本概念、工作原理、如何在React應用中集成Redux等方面。以下是一些常見的Redux問題&#xff1a; Redux的核心概念&#xff1a; 1、什么是Redux&#xff1f;它解決了什么問題&#xff1f; 它是一個狀態管理庫&#xff0c;解決…

2023國賽數學建模思路 - 復盤:校園消費行為分析

文章目錄 0 賽題思路1 賽題背景2 分析目標3 數據說明4 數據預處理5 數據分析5.1 食堂就餐行為分析5.2 學生消費行為分析 建模資料 0 賽題思路 &#xff08;賽題出來以后第一時間在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 賽題背景 校園一卡通是集…

個保新標 | 《信息安全技術 敏感個人信息處理安全要求》(征求意見稿)發布

8 月 9 日&#xff0c;全國信息安全標準化技術委員會公開發布關于國家標準《信息安全技術 敏感個人信息處理安全要求》&#xff08;征求意見稿&#xff09;&#xff08;以下簡稱《標準》&#xff09;的通知&#xff0c;面向社會廣泛征求意見。 《標準》的制定背景是為支撐《個人…

《Go 語言第一課》課程學習筆記(一)

配好環境&#xff1a;選擇一種最適合你的 Go 安裝方法 選擇 Go 版本 一般情況下&#xff0c;建議采用最新版本。因為 Go 團隊發布的 Go 語言穩定版本的平均質量一直是很高的&#xff0c;少有影響使用的重大 bug。可以根據不同實際項目需要或開源社區的情況使用不同的版本。 有…

攻擊LNMP架構Web應用

環境配置(centos7) 1.php56 php56-fpm //配置epel yum install epel-release rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm//安裝php56&#xff0c;php56-fpm及其依賴 yum --enablereporemi install php56-php yum --enablereporemi install php…

常見的字符編碼有哪些?有什么區別?

目錄 面試回答 知識擴展 Unicode 和 UTF-8 有啥關系&#xff1f; 有了 UTF-8&#xff0c;為什么要出現 GBK 為什么會出現亂碼 面試回答 就像電報只能發出“滴”和“答”聲一樣&#xff0c;計算機只認為 0 和1 兩種字符&#xff0c;但是&#xff0c;人類的文字是多種多樣的&…

B樹和B+樹區別

B樹和B樹的區別 B樹 B樹被稱為平衡樹&#xff0c;在B樹中&#xff0c;一個節點可以有兩個以上的子節點。B樹的高度為log M N。在B樹中&#xff0c;數據按照特定的順序排序&#xff0c;最小值在左側&#xff0c;最大值在右側。 B樹是一種平衡的多分樹&#xff0c;通常我們說m階…

什么是網絡地址轉換 (NAT)

網絡地址轉換&#xff08;NAT&#xff09;是更改源和目標 IP 地址和端口的過程&#xff0c;地址轉換減少了對 IPv4 公共地址的需求&#xff0c;并隱藏了專用網絡地址范圍&#xff0c;該過程通常由路由器或防火墻完成。 NAT是如何工作的 NAT 允許單個設備&#xff08;如路由器…