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...