Rus入门到放弃——字符串与字符切片
一.字符串定義
1.Rust的字符串常常指的是String,str,還是一種是字符串字面值。str是字符切片,通常以&str的方式使用。
//Stringlet r_string:String = String::from("Hello rust string!");//字符字面值定義的strlet r_str = "Hello rust str!";2.String和&str默認是utf-8編碼格式,而rust內置的char類型是4字節長度的,Unicode字符存儲,所以Rust里面的字符串不能視為char類型的數組,而是更接近u8類型的數,使用utf-8的優點是跟ASCII碼兼容,跟系統的大小端無法,更容易跨平臺。
二.獲取字符
1.因為rust用的utf-8編碼格式,則是不允許使用索引訪問字符串。
let r_string:String = String::from("Hello rust string!");//下標訪問let s1 = r_string[1];這里會報 Stringcannot be indexed by{integer} 這個錯誤。
2.Rust不實現使用索引的方式是因為字符串索引應該返回的類型是不明確的: 字節值、字符、字形簇或者字符串切片; 使用索引獲取 String 字符的原因是索引操作預期總是需要常數時間 (O(1))。但是對于 String 不可能保證這樣的性能,因為 IDE不得不檢查從字符串的開頭到索引位置的內容來確定這里有多少有效的字符。
3.Rust提供另一種區間訪問字符串的方式,使用索引的區間位置來切割字符。但必須按字符邊界切割。
let e_string = String::from("Hello rust str!"); println!("{}",&e_string[0..1]);這里會打印出首個字母H,但如果換成中文,這個區間下標就會引起恐慌。
let c_string:String = String::from("現實與理想");println!("{}",&c_string[0..1]);會報這個錯誤:thread ‘main’ panicked at 'byte index 1 is not a char boundary; it is inside ‘現’ (bytes 0…3) of 現實與理想', src/main.rs:8:20
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace ,因為一個中文字符占三個字節,必須按中文的字符的字符邊界切割。
這里會切出 “現”
4.關于區間訪問,rust給了幾個語法糖。
let s = String::from("Hello rust str!");let s1 = &s[..5];//[0..5]let s2 = &s[6..];//[6..(s.len()+1)]let s3 = &s[..];//等于sprintln!("{}\n{}\n{}", s1,s2,s3);三.字符串之間轉換
//聲明一個字符串切片let r_str:&str = "Hello rust str";//str轉Stringlet r_s1:String = r_str.to_string();//字面值let r_s2:String = "hello".to_string();//String轉strlet s:&str = &r_str;//數字轉Stringlet i = 12;//變量let r_s3:String = i.to_string();//字面值let r_s4:String = 13.to_string();四.字符串拼接
1.push方法
let mut ss3 =String::from("String literals");//把一個字符切片加到stringss3.push_str(" add string");//附加單個字符,要寫單引號ss3.push('L');2.使用加號
//加號let as1 = String::from("Hello");let as2 = String::from(" World!");//相加,第一個是原字符,第二是字符引用,相加后,第一個字符就失效(所有權問題)。//第二字符串所有權被保留let as3 = as1 + &as2;3.format宏相加
//format!相加let fos1 = String::from("one");let fos2 = String::from("two");let fos3 = String::from("three");let fos4 = format!("{} {} {}",fos1,fos2,fos3);println!("{}",fos4);總結
以上是生活随笔為你收集整理的Rus入门到放弃——字符串与字符切片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++指针与内存管理
- 下一篇: 智能老旧模糊照片修复——C++实现GFP