Rust的字串為什麼設計的這麼難用

時間 2021-08-12 11:29:02

1樓:記憶體塊生命週期

這不難用啊,因為確實應該拷一下記憶體。

首先leta ="hello";

letb ="world";

這兩和c語言的const char *一樣的。如果你要乙個string,那麼是不是得拷貝乙份?這時to_string建立了份string然後由變數c持有,變數c持有前有了string物件你才能+b。

如果你確定了a和b以及引用a和b的物件的生命週期,然後不對a和b更改,引用可以節省點資源。

可以試著用物件思維。你現在要在資料物件內儲存乙個字串,而如果不拷貝乙份,記憶體安全的情況下,這個物件的生命週期受制於你引用變數的生命週期。如果拷貝乙份,那麼這個物件持有string,物件只要還活著就完全可以放飛自我地用它,除非你把string送給其他物件了。

2樓:伊撒爾

很多時候,其實不需要關心所有權和引用,直接比較值就好了if*str==

*"hello"

{}2. format! 有奇效

format!(

"{}"

,str

).into

()尷尬,寫 rust 沒感覺出來和 js 區別……我是不是沒救了

3樓:WayneYang

想知道你說的難用的結論,是和哪一門語言比較得出的。你覺得"".to_string()無法理解,可以換一種等效的寫法:

String::from(""),這是很多語言很常見的構造物件的寫法吧。

4樓:hzqd

沒錯,它是故意被設計得這麼難用。

你沒看錯,這是有意為之的。

你不寫 .to_string(),怎麼能體現出多了一層開銷呢?

你不加 』static,怎麼能保證零成本抽象的記憶體安全呢?

至於拼接字串,有 format 巨集可用。

5樓:

String是乙個擁有所有權的字串(連續的存在堆上的儲存),而&str是乙個不擁有所有權的字串的引用 。

當你使用乙個字串的時候,Rust強迫你考慮到字串的所有權:

Rust的拼接字串會消耗掉self的所有權,並且產生乙個新的String(底下實現是push_str),因此self的型別必須是String而不能是&str;而other的內容本身不會發生變化(會被拼接在self後面),因此只需要是乙個引用而不需要消耗掉所有權。

impl

Add<&

str>

forString

}事實上,當你試圖拼接兩個不具有所有權的&str時,第一步也不得不對第乙個&str進行to_string(),而這就涉及了堆上的分配。Rust只是強迫你把堆上的分配寫出來,從而避免隱式的分配操作。(想象乙個沒有alloc的環境,此時無法進行兩個字串的拼接)

2. 存在struct內部的&str並不擁有對應字串的所有權,因此當實際擁有所有權的字串drop時對應的引用會失效,因此Boo必須有生命週期標記內部的&str的生命週期。

對於字串常量,可以直接使用'static生命週期。

3. 對於需要大量字串格式化的情況,試試format! 巨集

如何通過只翻轉乙個字串的子串對該字串進行排序?

老版題是NP很多人已經給出參考文獻了。新版題是裸dp 設len是字串strls的長度,那麼定義dp len 1 2 表示直到長度x 0 x len 最後一位strls x 1 不翻轉 翻轉 0 1 所需的最小翻轉次數。 yaoyao 反轉兩個字元的子串不就是交換兩個字元的位置嗎?這是氣泡排序呀 喵的...

C語言中,字串常量為什麼只能給字元陣列初始化,而不能通過指標賦值

程佳 陣列是指標常量,常量不能賦值。字串在c語言裡不是原生資料型別,就是乙個內容非0結尾為0的位元組陣列。所以對字串的操作要使用string.h裡那些庫函式。 神念的經 想啥呢,一旦定義成了靜態陣列,首元素位址就是定死的。想改位址?門都沒有。指標賦值?那是改指向的位址,不是改指向的內容。strcpy...

Java中,字串轉整數的方法為什麼放在Integer類而不是String類中?

Cyandev 應該是遵循單一職責原則,String 不具有轉化為其他型別的義務,假設還會有更多型別需要從 String 轉換來,那豈不是需要乙個很龐大的 String 類?況且 String 的任務就是處理字串,而不是各種轉換任務。我也見過將這一操作放在 String 類裡的類庫,比如說 Qt,Q...