Rust 第一期學習記錄

Rust 一門賦予每個人構建可靠且高效軟件能力的語言。具有高性能、可靠性、和生產力三大特點。

image.png

接下來就從安裝,開發環境搭建、基礎概念和語法了解三個部分介紹第一周學習Rust的情況。默認為Mac環境

0、安裝Rust

優先建議使用rustup工具進行安裝操作

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

另外如果本地已經安裝了較低的版本,則可以通過rustup update進行版本升級操作,經過一陣子的等待之后,rust安裝文案提示成功即可,還需要配置環境變量

可以在用戶當前的根目錄下的.bash_profile文件末尾添加如下配置

# rust
export PATH=$PATH:$HOME/.cargo/bin

最后進行source .bash_profile 刷新即可。通過如下操作檢驗是否安裝成功,參數一定得是大寫的V

?  ~ cargo -V
cargo 1.51.0 (43b129a20 2021-03-16)
?  ~ rustc -V
rustc 1.51.0 (2fd73fabe 2021-03-23)

cargo Rust構建工具和包管理器,在安裝Rust的時候,會自動安裝Cargo

  • cargo build 構建項目
  • cargo run 運行項目
  • cargo test 測試項目
  • cargo doc 構建項目文檔
  • cargo publish 將當前的庫發布到cartes.io 上

至此整個的運行環境就已經搭建完畢

1、開發環境搭建

VS Code作為開發環境,安裝好Rust的相關插件,插件rls,

  • Rust代碼支持,rls
image.png
  • Rust包版本管理工具,crates
image.png
image.png
  • TOML文件高亮支持


    image.png

在終端環境輸入cargo new rust-learn就會自動的創建rust-learn項目,其中的src文件包含了入口文件main.rs

image.png

運行也就可以直接在終端輸入cargo run即可,出現的warning只是警告信息,并不會影響程序的執行,而Error則會停止服務的運行

image.png

至此,已經可以開始進行demo的編寫,語法的學習以及正常的代碼開發工作了。

2、基礎知識學習

Rust的突擊學習一周,感覺Rust是個大雜燴,包含了多種語言的相關特點,例如:

  • 變量聲明的時候采用了JS的規則,可是其又是一個強類型的語言,Rust可以手動自定義類型也可以根據具體數據推測其數據類型;
  • 默認是不可變的,如果需要變成可變的則需要手動添加mut可變關鍵字,這個和scala類似;
  • 內存管理則吸收了C和Java的特點,C里面需要手動申請和釋放內存,而Java則是由JVM統一管理,Rust則是自動申請內存,而在當前的作用域完成之后,自動的添加相關內存釋放的操作;
  • 有類似scala的trait特性,其初步理解和接口比較接近,默認返回一個數據的時候可以不用寫return關鍵字
  • 有類似C語言的&指針的概念,為數據的所有權做好足夠的約束

說了這么多,接下來就來學習一個Rust吧~

數據類型

Rust是一門強類型的語言,其類型分為整型,浮點型,布爾類型,字符類型 幾種類型,在使用的時候都應該帶上具體是8位還是16位的相關說明,而不是和java一樣,完全由JVM屏蔽了其對象大小的細節情況,從另一個角度來看,也可以節省內存吧。

  • 整型
位長度 有符號 無符號 表達形式
8-bit i8 u8 0o77,0o16
16-bit i16 u16 0xff,0x12
32-bit i32 u32 -
64-bit i64 u64 -
128-bit i128 u128 -
arch isize usize -
  • 浮點型

f32f64兩種類型

  • bool布爾類型

truefalse兩種

  • 字符型

char字符類型,一般是4個字節,因為是4個字節,那么就可以支持中文、日文、emoji表情等數據,使用UTF-8作為編碼格式,注意使用GBK之后導致的亂碼情況,使用單引號括起來

不可變,可變,重影,常量

代碼Demo如下

fn test01() {
    let a = "Hello";
    // 1、a = "zhangsan"; 不可變對象
    // 會提示錯誤 「cannot assign twice to immutable variable」
    let a = "lisi";
    // 2、重影
    println!("a:{}", a);

    let mut b = "Hello";
    b = "zhangsan";
    // 3、可變對象
    println!("b:{}", b);
    
    const Count:i32 = 32;
    // 4、常量
    println!("count:{}", Count);
}

運行結果:

    Finished dev [unoptimized + debuginfo] target(s) in 1.22s
     Running `target/debug/rust-learn`
a:lisi
b:zhangsan

使用let關鍵字進行聲明變量,而且默認是不可變對象,如果再對其進行賦值操作,則會出現錯誤「cannot assign twice to immutable variable」,這點和對Java的認識是不一樣的,一旦固定下來了,就是不可變的??梢允褂?code>let mut關鍵字設置可變對象。重影Shadowing則是給當前賦值對象重新指向一個數據

總結&理解
默認不可變可能是Rust從高并發安全的角度設計的,盡量減少對數據的改值操作
重影shadowing則是一個新的概念,此外并沒有接觸,還是應該從內存管理的角度理解吧,如代碼中2的操作之后,之前的Hello對象,就會被系統自動的remove
常量必須指定數據類型,而且應該是具體的數據表達式,而不是什么方法之類的,此外也不可用于重影操作
Rust對內存、安全的要求有點嚴苛

String、&str和所有權

先看看如下代碼

fn test02() {

    fn cp(content: String) {
        println!("content:{}", content);
    }

    let a = "Hello World";   // 1
    cp(a);
    println!("a:{}", a);
}

代碼很簡單,大致也能知道只需要傳入一個String的參數數據進行打印操作,然后把數據本身再打印一次,如果正常的話,則會輸出兩遍結果。但是意外的是,這個代碼出現了2個錯誤

  • 錯誤1 cp方法出現錯誤 expected struct String, found &str

報錯意思很明顯,希望傳入的String類型,但是實際傳入的則是&str,這就引出來了一個情況,1處的代碼生命的對象實際上是&str類型,而不是期望的String

  • String是一個可變的、堆上分配的UTF-8的字節緩沖區,存在len()和capacity()方法
  • str是一個不可變的固定長度的字符串,只有一個len()方法
  • &不能僅僅理解成指針,實際上是租借borrowed的意思
    image.png

那么怎么解決問題呢,把方法定義和傳入的參數定義統一即可,都改成String,或者&str,甚至&String等

&str ==> String的幾種方案

let a = "hello";
let b1 = a.to_string();
let b2 = String::from(a);
let b3 = a.to_owned();

String ==> &str的幾種方案

let a = String::from("hello");

let b1 = &a;
let b2 = a.as_str();
  • 錯誤2:最后的一行出現錯誤 value borrowed here after move

意思很清楚,數值被使用的時候已經被remove掉了,就無法使用,為什么呢?

主要原因是因為傳入到cp方法的參數是對象a本身,a的作用域已經被移動到方法內部了,隨著作用域的改變,在方法外的打印操作就屬于作用域外的調用執行,所以就被理解成remove掉了,那么自然就會出現失敗的情況。再看一個下面的代碼,加強對所有權的理解

fn main() {
    let s = String::from("hello");
    // s 被聲明有效

    takes_ownership(s);
    // s 的值被當作參數傳入函數
    // 所以可以當作 s 已經被移動,從這里開始已經無效

    let x = 5;
    // x 被聲明有效

    makes_copy(x);
    // x 的值被當作參數傳入函數
    // 但 x 是基本類型,依然有效
    // 在這里依然可以使用 x 卻不能使用 s

} // 函數結束, x 無效, 然后是 s. 但 s 已被移動, 所以不用被釋放


fn takes_ownership(some_string: String) {
    // 一個 String 參數 some_string 傳入,有效
    println!("{}", some_string);
} // 函數結束, 參數 some_string 在這里釋放

fn makes_copy(some_integer: i32) {
    // 一個 i32 參數 some_integer 傳入,有效
    println!("{}", some_integer);
} // 函數結束, 參數 some_integer 是基本類型, 無需釋放
fn main() {
    let s1 = gives_ownership();
    // gives_ownership 移動它的返回值到 s1

    let s2 = String::from("hello");
    // s2 被聲明有效

    let s3 = takes_and_gives_back(s2);
    // s2 被當作參數移動, s3 獲得返回值所有權
} // s3 無效被釋放, s2 被移動, s1 無效被釋放.

fn gives_ownership() -> String {
    let some_string = String::from("hello");
    // some_string 被聲明有效

    return some_string;
    // some_string 被當作返回值移動出函數
}

fn takes_and_gives_back(a_string: String) -> String { 
    // a_string 被聲明有效

    a_string  // a_string 被當作返回值移出函數
}

最后自己嘗試著用各自方法解決一下demo中出現的錯誤

總結&理解
String和str是完全不同的兩種數據結構,默認定義一個字符串是str的類型
在使用方法的時候,寫的參數一定需要注意到,是否有使用引用,是否被提前移除等情況

暫時就先總結這么多,后面的繼續學習和更新

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內容