Rust學習入門

介紹

特性:

高性能,內存利用率高,沒有運行時和垃圾回收
可靠 , 豐富的類型系統和所有權模型保證內存和線程安全,編譯器可以消除各種錯誤
生產力, 包管理器、構建工具一流, 多編輯器支持自動補齊和格式化代碼

應用場景:

命令行工具,無需解釋程序,直接生成目標可執行程序
web應用, 可以直接生成WebAssembly
網絡服務器, 極低的資源可以做到安全高效,具備大規模併發處理能力
嵌入式設備, 具備javascript一般的高效開發語法和c語言的執行效率,支持底層平臺開發

環境搭建、IDE

mac 上安裝rust,使用rustup 管理工具鏈
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

升級rust
rustup update

卸載rust
rustup self uninstall

驗證rust 是否安裝

rustc --version
rustc 1.60.0 (7737e0b5c 2022-04-04)

IDE 採用Visual Studio Code, 然後安裝兩個插件: rls 和 Navite Debug

接下來創建項目運行輸出Hello world程序

終端執行以下命令,創建rust-demo項目,會生成hello world 程序代碼
cargo new rust-demo

編譯執行 cargo build 以及cargo run 命令

cargo build
   Compiling rust-demo v0.1.0 (/Users/xx/vs-workspace/rust-demo)
    Finished dev [unoptimized + debuginfo] target(s) in 1.55s
cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/rust-demo`
Hello, world!

Cargo 是 Rust 的構建系統和包管理器。Rust 開發者常用 Cargo 來管理 Rust 工程和獲取工程所依賴的庫

cargo check 檢查代碼,確保能通過編譯,但是不產生可執行文件

發佈應用:
cargo build --release
編譯會進行優化,運行更快,編譯時間更長

rust cargo build一直出現 Blocking waiting for file lock on package cache問題解決方案:

如果確定沒有多個程序佔用,可以刪除rm -rf ~/.cargo/.package-cache,然後再執行

猜數遊戲

目標: 生成1到100隨機數, 提示玩家輸入一個猜測, 猜完提示猜測太小還是太大. 猜測正確,打印慶祝信息,程序輸出

use rand::Rng;
use std::cmp::Ordering;
use std::io;

fn main() {
    println!("猜數遊戲");
    let secret_number = rand::thread_rng().gen_range(1..101);

    loop {
        println!("猜測一個數");
        let mut guess = String::new();

        io::stdin().read_line(&mut guess).expect("無法讀取行");

        let guess: u32 = match guess.trim().parse(){
            Ok(num) => num,
            Err(_) => continue,
        };

        println!("你猜測的數據是{}", guess);

        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Too small"),
            Ordering::Greater => println!("Too big"),
            Ordering::Equal => {
                println!("You win");
                break;
            },
        }
    }
}

rust庫下載: https://crates.io/

數據類型和函數

常量和變量: 常量 const, 變量 let 聲明
shadowing: 可以使用相同的名字聲明新的變量,新的變量會隱藏之前聲明的同名變量, 使用let聲明的同名新變量, 它的類型可以與之前的不一樣.

標量類型:
整數類型 isize和usize的位數由計算機的架構所決定,使用場景主要對某種集合進行索引操作,整數默認類型是i32
浮點類型 f32 單精度, f64 雙精度 。 默認類型是f64
布爾類型 bool 一個字節大小
字符類型 char 四個字節大小 , Unicode變量值

複合類型:
Tuple let tup:(i32, f64, u8) = (500, 6.4, 1) , 訪問tup: tup.0, tup.1, tup.2
數組 let a:[i32; 5] = [1,2,3,4,5] 數組是stack上分配的單個塊的內存

函數:
聲明使用fn關鍵字
函數和變量名使用snake case , 所有字母小寫,單詞之間用下劃線分開
函數簽名必須聲明每個參數的類型
-> 聲明函數返回值的類型
返回值就是函數體最後一個表達式的值,提前返回使用return關鍵字

註釋分以下幾種:

1. // /* */  單行
2./*
 */ 
 多行註釋
3. 用 /// 作爲說明文檔註釋的開頭 

Cargo 具有 cargo doc 功能,開發者可以通過這個命令將工程中的說明註釋轉換成 HTML 格式的說明文檔。

控制結構

if else: 使用多於一個else if 可以使用match 重構代碼
loop循環: break 中止循環
while 循環:
for循環安全、簡潔,在rust裏用的最多

所有權

rust特性,讓rust無需GC就可以保證內存安全
rust內存是通過一個所有權系統來管理,包含一組編譯器在編譯時檢查的規則, 程序運行時,所有權特性不會減慢程序的運行速度
棧內存和堆內存
stack 按值接收順序存儲,後進先出
所有存儲在stack必須擁有已知的固定的大小
編譯時大小未知或運行時大小可能發生變化的數據必須存在heap上
指針存放在stack中
訪問heap數據比stack慢,需要通過指針才能找到heap中的數據
當變量走出作用域,內存會立即自動的交還給系統

應用和借用, & 表示應用. 在特定作用域內,對於某一塊數據,只能有一個可變的引用
創建同一個變量的多個可變引用

fn main() {
     let mut s = String::from("hello")
     {
         let s1 = &mut s;
     }

     let s2 = &mut s;

    }

不可以同時擁有一個可變應用和一個不可變的引用,多個可變的引用是可以的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章