Tagged

Rust

Rust 的系列教學文

Tips

在 Alpine Linux 上用 bindgen 的踩雷紀錄

最近在弄專題時,想說在一個比較單純的環境裡做測試,就挑了 Alpine Linux 來用。結果在編譯時跑 bindgen 吃了不少苦頭。 最一開始是這樣的,bindgen 會回報說無法動態載入 clang 的 shared library,錯誤訊息是 Dynamic loading not supported 。 幸好,bindgen 有提供 static 的 feature 可以用 cargo install --no-default-features --features static,logging,clap,which-rustfmt bindgen但是裝起來之後,一下指令就 Segmentation fault 是怎麼回事?? Debug 了一下就發現,他的 GOT 並沒有 relocate 到正確的地址上,查了很久才發現 rust

Rust

Rust 導引筆記系列 #11 -- 列舉 (enum)

Rust 中也有 enum,用來表示一系列的數值,與其他語言不太一樣的地方在於:它可以儲存額外的資料。 enum State { Init, Success(String), Error { message: String, code: u32, }, }如上所示,每個列舉數值可以帶 Tuple-Like 或 Struct-Like 的資料,這部份有點像 C 的 Enum + Union。這個特質相當有用,在標準函式庫中也大量被使用,其中最重要的就屬 Option<T> 和 Result<T, E> 了。等一下會介紹 Option<T> 的使用,而 Result<

Rust

Rust 導引筆記系列 #10 -- 結構 (struct)

在程式語言中,要定義自訂的類型一般都會使用 struct 或 class 等之類的關鍵字來定義。 定義在 Rust 中是用 struct 這個關鍵字進行定義。基本上寫起來會長這樣: struct Time { hour: u32, minute: u32, second: u32, }每一個欄位都是以 名稱: 類型 的方式定義,這個模式跟變數定義 (通常類型會省略) 與函數參數的定義方式是一樣的。 建構當定義好一個結構之後,就可以用以下方式建立它: struct Time { hour: u32, minute: u32, second: u32, } fn main() { let t = Time { hour: 8, minute: 12, second: 56, }; }欄位存取使用 obj.

Rust

Rust 導引筆記系列 #08 -- if 條件

if 判斷式雖然說在前面應該有見過不少次了,但還是要正式介紹一下。 Rust 的 if 判斷式大致上長這樣: if a > 20 { do_something(); } else { do_otherthing(); }整體上,看起來和目前主流的大多數語言都是一樣的語法。不過還是有許多地方是不同的,最明顯之處莫過於 if 之後的條件判斷是不需要加括號的,而且編譯器也會建議你拿掉它。 至於另一個不同之處也是我喜歡 Rust 的原因之一。 陳述式與表達式 (Statement & Expression)一般在程式語言中,語句會分為兩類:陳述式與表達式,兩者的概念大概是這樣: 陳述式:代表去執行一件工作,不會具有回傳值。在 C/C++/Java 等語言中,分號就是一個陳述式的結尾。表達式:程式中的一部分往往可以計算出一個值,像是 a < b 、 100

Rust

Rust 導引筆記系列 #07 -- 借用與參照

物件借用 (Borrowing)在上次的最後有提到,若是要暫時取得某個不具 Copy 特徵的使用權,就要把所有權傳給該函式,再傳回來。 這顯然不是一個好方法,所以這次就要來介紹「借用」這個機制。 與 C 語言中的取址運算子相當類似,在一個變數的前方加上 & 符號,就可以借用一個變數的數值。在 Rust 中,「借用」會讓我們拿到一個參照,指向被借用的數值。 利用這個機制,我們可以將上一篇最後的範例改為 fn print_string(s: &String) { println!("The string is: {}", s); } fn main() { let str = String::from("My name is Leo, nice to

Rust

Rust 導引筆記系列 #06 -- 物件所有權 (Ownership)

從本篇開始,就要進入核心部份了。所有權的傳遞與借用是 Rust 能在記憶體安全性保證之下卻又不需要垃圾回收器 (Garbage Collector, GC) 的關鍵,也是讓效能足以與 C++ 批敵的特性。 溫馨提醒:本篇具有一些重要觀念,請帶著清楚的腦袋閱讀~~ 值與變數與所有權 (Value & Variable & Ownership)首先,我們需要建立一個觀念:變數和它所帶有的值是不同的兩種東西 變數就如同是一個容器,可以在裡面裝入數值(內容物)。當在讀取變數時,實際上是在讀取內容物的部份,因此,變數必須要有數值才可以讀取它。在一般使用上,也是如此。 在 Rust 中,每個數值(內容物)都對應到一個變數(容器),這個變數稱作「擁有者」(Owner);也就是每個數值只能被裝在一個變數裡。 當變數脫離它的作用域時,裡面的數值就會自動被捨棄 (dropped),這個變數也不再能被使用。 fn main(

Rust

Rust 導引筆記系列 #05 -- 基本資料型態 II

接續上次沒寫完的部份...補充一下陣列或複合類的資料結構吧 陣列Type Annotation: [T; n] Rust 的陣列必須是固定長度的物件,當長度小於等於32時,就會幫你實作一些功能(比較、預設值…等) fn main() { let prices = [25, 35, 40, 50, 55]; // Initialize 8 elements as 100 let array = [100; 8]; // 64 Bytes Empty Binary Data let bin = [0u8; 64]; // Access index 1 println!("Price of the second item: {}", prices[