rust學習九.2、集合之字元

正在战斗中發表於2024-11-18

按照作者的意思,字元不是看起來那麼簡單!

的確,字元在大部分語言中,都不是看起來那麼簡單!

字元的內容看起來很多,又很少!

多是因為涉及到編碼、構成、方法(有許多方法)還有字元切片。

少是因為,其實和java等語言其實沒有大的區別。

一、構成

rust的字元內部是 vec(u8)+方法,看起來和java其實區別不大,至少在邏輯層面,大家差不多!

rust.String定義

java.String定義(jdk17,摘選)

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence,
               Constable, ConstantDesc {
    @Stable
    private final byte[] value;
}

沒有太多本質的區別,大家都有陣列儲存實際的值,不同的是java儲存的是位元組陣列,而rust儲存的u8陣列。

這都是表面的,其實都是一個位元組陣列。

如果用的是rustOver,那麼檢視原始碼還是比較方便的,操作方式和eclipse,idea一樣,ctrl+點選滑鼠左鍵。

如上圖,點選紅色矩形中的String,即可跳轉到String.rs

二、示例

上例中,使用字串切片,這個其實和字串沒有本質的區別,因為前者是對字串的區域性引用。

上例中,演示了企圖透過索引/或者切片的方式訪問多位元組utf-8字元的部分資料時發生錯誤的情形。

這種情況下,會給出足夠好友的提示! 這也是rustc的一大優點。

根據這個提示,如果把上文的程式碼改為:

println!("{}的第一個字元是:{}",cn,&cn[0..3]);
那麼還是可以正確執行的!

需要逐個列印字串的每個字元,可以使用以下方式:

let cn:String="中華人民共和國".to_string();
println!("cn的包含了以下幾個漢字:");
for c in cn.chars(){
println!("{}",c);
}

三、小結

才看了個頭,不敢說對String有什麼深入瞭解,所以就說一些基本的:

  1. rust的String和其它語言(java)並沒有大的區別
  2. 注意rust使用utf-8來儲存字元的,無法指定其它字符集。如果要達到那個目的,只能另尋他途
  3. 採用utf-8對於GBK編碼的並不友好,無疑多少要會浪費一些空間和效能.如果是java就十分方便,只要指定GBK編碼即可.

相關文章