正在戰鬥中 -
rust學習二十.3、RUST使用不安全代碼訪問靜態變量
一、前言
1.1、為什麼要使用不安全塊訪問可變靜態變量
根據rust設計人的理解:靜態變量是可以修改,所以在併發情況下是可能存在併發/並行時候的不一致問題(如果要修改),這可能就不安全了。
所以,rust規定訪問可變靜態變量需要使用不安全代碼塊(unsafe塊)。
1.2、比較靜態變量和常量
1.常量與不可變靜態變量的一個微妙的區別是靜態變量中的值有一個固定的內存地址。使用這個值總是會訪問相同的
rust
正在戰鬥中 -
rust學習二十.4、RUST使用不安全代碼訪問union(一存多表)類型
一、前言
看UNION的定義,頗為驚訝,居然有這樣的類型(以前沒有怎麼用過C)。
以下一段來自於文心一言:
1.定義和用途
union允許在相同的內存位置存儲不同類型的數據,但在任意時刻只能使用其中一個類型。
適用於需要在節省內存的情況下靈活存儲不同類型數據的場景。
2.內存佈局
所有字段共享相同的內存位置。
這意味着union的大小由其最大字段決定。
3.安全性與用
rust
正在戰鬥中 -
rust學習二十.5、RUST特質中的關聯類型
這是rust特質(trait)中頗有意思的一個特性。
一、前言
這個特性,在前面已經有接觸過,例如書本的第十三章節的迭代器特質就有這個例子:
impl Iterator for BooksIterator {
type Item = String;
fn next(mut self) - OptionString {
if self.current_index 3
rust
正在戰鬥中 -
rust學習二十.6、RUST通用類型參數默認類型和運算符重載
一、前言
為通用類型賦予一個默認的類型,大部分的語言是沒有這個特性的,但是也有例外的,例如TypeScript(可能還有其它)。
例如TypeScript可以這樣使用:
class MyClassT = number {
value: T;
constructor(value: T) {
this.value = value;
}
printValu
rust
正在戰鬥中 -
rust學習二十.7、RUST完全限定名以及靜態方法
rust中看不到java等一些OOP語言的中用於修飾方法的static之類的關鍵字眼。
注:rust有static關鍵字,目前是用於修飾生命週期的或者是變量的
例如:
let leaked_str: 'static str = Box::leak(tmp.into_boxed_str());
static mut SIGN: u32 = 0;
rust
正在戰鬥中 -
rust學習二十.8、RUST特質的限定,實為對類型的限定
有的時候,可能希望使用的特質已經實現了其它特質(看後面可以知道,實際是要求相關類型實現了其它特質)。
RUST支持為特質(trait)指定限定的特質。
例如我們定義特質A,之後定義了類型T,這個時候還希望T已經實現了特質TC。
在rust中就是這個語法:
trait tx:t1
trait tx:t1+t2..+tn
根據相關數據的例子和説明,需要特別注意,具體的實現都是依賴於類型,而不是特質。
rust
正在戰鬥中 -
rust學習二十.9、RUST繞過孤兒規則實現特質和包裝器缺點
回憶下孤兒規則:
1.只有當一個trait或類型在當前的crate中定義時,才能為外部類型實現該trait。 沒有限定是特質還是類型
反過來,如果特質和類型都是外部,那麼不能在當前單元包實現
2.例外情況-std中特質是例外。大體驗證了凡事都有例外
孤兒規則的目的:避免編譯器無法確定應該用哪一個實現。
這個目的很容易理解。無論是否叫孤兒,絕大部分語言中都是類似的規則-不允許一個類型實現接口/特質的
rust
正在戰鬥中 -
rust學習二十.10、RUST高級類型之新類型模式和類型別名
這兩個內容都比較容易理解。
一、新類型(newtype)模式
注意,這裏説的是一種編程模式,不是説有一個叫newtype的類型。
這種編程模式的含義:為某個類型作個封裝,構建一個新的類型,以便繞過某些束縛,從而達成特定目的。
目的如下:
a.用於抽象掉一些類型的實現細節
b.可以隱藏其內部的泛型類型
c.實現曲線救國
一個典型的例子,利用新類型繞過孤兒規則。
二、類型別名
語法
type xxx=
rust
正在戰鬥中 -
rust學習二十.12、RUST動態大小類型DST以及Sized特質
DST(dynamic size type)-中譯“動態大小類型"。本文簡要討論動態大小類型的一些問題。
一、前言
rust作為一門靜態類型語言,和大部分其它靜態類型語言(C,C++,C#,JAVA)一樣,希望在編譯的時候知道每個實例/類型的大小。
作為靜態類型語言,優點是毋庸置疑的的:
1.類型錯誤(如字符串與整數運算)在編譯階段即可被捕獲,減少運行時崩潰風險
2.編譯器可基於類型信息優化內存分
rust
正在戰鬥中 -
rust學習二十.13、RUST的函數指針fn和匿名函數
函數指針是一個好東西。
一、簡述
函數指針就是執行一段函數代碼的指針。
根據官方的説法,函數指針實現了FnOnce,FnMut,Fn特質。
由於函數指針是一種數據類型,所以rustc允許它作為函數/方法的參數,這樣就給程序設計添加了不少的靈活性.
我估摸着,rust設計者就是為了讓rust能夠適應潮流:在函數/方法中直接傳遞匿名函數/閉包
一個典型的帶有函數指針的rust函數定義如下:
rust
正在戰鬥中 -
rust學習二十.14、RUST宏
毫無疑問,宏是rust中極其重要的存在,只要我們看看一些標準庫的代碼。本文闡述rust宏相關的若干問題
一、宏的定義和作用
先介紹下宏的起源和歷史,以便讀者更能體會。
以下內容來自文心一言生成:
詞源與早期含義
希臘-拉丁詞根
"macro"源於希臘語前綴μακρο-(makro-),意為“大”或“長”。拉丁語繼承為macro-(如macro-instruction),保留“大”的
rust
正在戰鬥中 -
rust進階-基礎.1.匿名函數和FnXXX特質
在rust中,匿名函數(或者説閉包)大量存在,所以有必要再次討論匿名函數的一些問題。
其中比較關鍵的是和FnXXX特質的關係,以及和被捕獲變量的關係。
本文的目的在於確認幾個要點:
一、FnOnce,FnMut,Fn簡單比較
比較彙總表
分類
執行次數
是否可以修改捕獲的外部變量
是否歸還捕獲的外部變量
備註
FnOnce
一次
rust
正在戰鬥中 -
rust進階-基礎.2.Option類型
Option類型是Rust中非常重要的一個類型,和Result也類似。
本文主要根據文檔:枚舉類型Option編寫
主要闡述以下內容:
1.Option和Result比較
2.Option的主要方法
3.示例
1.Option和Result比較
以下內容來自於文心一言
特性
Option
Result
目的
表示一個值可能存在(Som
rust
正在戰鬥中 -
rust進階.併發.Tokio.1.Tokio簡介
學習要,工作也不能拉下,所以這一段時間關於rust的博文少了些。
rust要學習的內容還很多,但我覺得應該優先打好基礎,這其中比較關注的是併發。
提到rust的併發,先回憶在書本rust編程語言有許多的內容:
1.併發和並行
2.通過信道(channel)共享進程間數據
關鍵庫和方法
std::sync::mpsc
mpsc::channel()
std::thread
rust