「Programming Rust筆記」修訂間的差異
Tankianting(討論 | 貢獻) |
Tankianting(討論 | 貢獻) |
||
(未顯示同一使用者於中間所作的 6 次修訂) | |||
行 1: | 行 1: | ||
{{Nav|程式語言、邏輯學|Rust筆記}} | {{Nav|程式語言、邏輯學|Rust筆記}} | ||
{{Book|Jim Blandy, Jason Orendorff & Leonora F.S. Tindall|9781492052593}} | {{Book|Jim Blandy, Jason Orendorff & Leonora F.S. Tindall|9781492052593}} | ||
: Version 2 的筆記 | |||
==Ch1概論== | ==Ch1概論== | ||
*系統程式語言有「未定義行為」。 | *系統程式語言有「未定義行為」。 | ||
行 61: | 行 63: | ||
* std::process::exit(1); 輸出錯誤回傳值1。 | * std::process::exit(1); 輸出錯誤回傳值1。 | ||
* println!("...{}...{:?}", a, b); // {} 和{...}都是template-string。 | * println!("...{}...{:?}", a, b); // {} 和{...}都是template-string。 | ||
rust支援concurrency。 | |||
使用mutex,並且此處顯示多執行緒的撰寫 | |||
all rust functions are thread-safe | |||
loop{x = x * x;} | |||
上文是loop語句 | |||
num library有複數。 | |||
<pre> | |||
Complex<T>{ | |||
re:T, //實部 | |||
im:T // 虛部 | |||
} | |||
Complex<f32> // 用f32存 | |||
let c = Complex{re: 0.24, im 0.3}; | |||
c.re == 0.24; | |||
c.im == 0.3; | |||
enum Option<T>{ | |||
None, | |||
Some(T), | |||
}</pre> | |||
比較 | |||
{| class="wikitable" style="margin:auto" | |||
!result | |||
!option | |||
|- | |||
|Ok(x) | |||
|Some(x) | |||
|- | |||
|Err(e) | |||
|None | |||
|} | |||
<pre> | |||
let x = (2,3) // tuple | |||
//x.0 == 2 第0個元素 | |||
//x.1 == 3 第1個元素 | |||
</pre> | |||
<pre>2.0 as f64 // 強制指定型別</pre> | |||
[https://github.com/crossbeam-rs/crossbeam crossbeam]:建構concurrency的函式庫 | |||
#[derive(Debug)] // 用 {:?}可以做除錯 | |||
use regex::Regex; //使用regex | |||
let regex = Regec::new(target)?; // ? 是使Error浮上的方式,類似if (Error){Error}{content; /* Ok(content)取出content */} | |||
<pre> | |||
regex.replace_all(text, replacement).to_string() | |||
↑&str ↑&str | |||
</pre> | |||
==Ch3 基本型別== | |||
Rust有型別推論和多型(解決鴨子型別,就是有函數或性質同名的就可執行,但是難以找到錯誤。Python、JS使用) | |||
P.51列出範例型別 | |||
struct E; 類Unit型別 | |||
Box<A> 有指標指到heap裡面 | |||
&reference 參照 | |||
[f64; 4]矩陣 | |||
String 動態大小字串 "example".to_string() | |||
Vec<f64> 可變長度矩陣 | |||
trait object: | |||
引用到任何實作特定方法集合的值 | |||
&dyn Any, [value as &dyn Any,] | |||
fn(&str) -> bool | |||
Closure 沒有型別表達方式 | |||
|a, b| {a+b} | |||
enum Attend | |||
{OnTime, | |||
Late(u32)} | |||
詳細說明 | |||
struct -> Ch9 | |||
enum -> Ch10 | |||
String and str -> Ch17 細節 | |||
trait -> Ch11 | |||
function & closure -> Ch14 | |||
基本數有u8, i8, u16, i16, u32, i32,u128, i128 f32, f64等 | |||
任意精度數在 num crate | |||
char 不是u8也非u32 | |||
42u8, 1729isize ->數字後加型別,可以強制指定型別。 | |||
預設用i32 | |||
b'a' = 65u8 // byte literal | |||
b'\'' , b'\\', b'\n', b'\r', b'\t' -> 脫逸字元 | |||
b'\x1b' = 27 // (0x1b = 27,escape字元) | |||
10_i8 as u16 -> 轉換到 u16 | |||
[[category:資訊]] | [[category:資訊]] |
於 2024年10月7日 (一) 23:57 的最新修訂
- Version 2 的筆記
Ch1概論
- 系統程式語言有「未定義行為」。
- 使用者輸入的內容可能會導致程式漏洞。
- 編譯時消除未定義行為
- 安全,亦於使用
- 平行編譯
- 0 overhead的C++,只有必要花費,不會花費太多資源消耗
- 善用底層
- cargo、trait、generic
Ch2 Rust特性簡單導覽
- rust doc產生文件
- rust編譯器
- cargo編譯管理器
- cargo clean清除編譯文件
- cargo new --vcs none #不生成.gitignore
- cargo run # 直接編譯系統執行
- 通常不用寫return。沒有
;
結尾的視為回傳值。
- 函數定義示例:
fn foo(mut n :i64) -> i64{ ... }
assert!(a == b)
錯誤時拋出panic
- identifier後面的
!
為巨集 let x = m
可以這樣寫,會儘可能型別推論。比較let x : i64 = m
。let 表局域變數。- 4空白是縮排標準。
- i32 u8 f32(C float) f64(C double)
- mut 指示可變變數
- assert! 一定會被執行。debug_assert!正式執行時候不會執行此assertion。
#![test] // attribution,控制編譯器、code style,或檢視條件加入程式碼。 fn test_gcd(){ assert_eq!(foo(x), rhs); #檢查左右有沒有相等的assertion }
- Vec::new() // 類似Python的List
- use std::str::FromStr; 和 use std::env:呼叫外部函式庫
- rustup doc --std # 生成標準函式庫文件
for arg in env::args().skip(1)
跳過第一個argument,取值跑迴圈。- numVec.push(item); #將item往後附加於numVec
- u64::from_str(numInStr).expect("errorMsg") // 回傳 result = Ok(v) | Err(e),若是Err則吐出 "errorMsg"。
- eprintln!("err"); #寫到標準錯誤輸出流
for m in &numbers[1..]{ d = gcd(d, *m); }
上方的&表示m只是一個ref,將numbers借用,不改變numbers這個變數的所有權。
- m 表示將ref轉成值,deref。
- std::process::exit(1); 輸出錯誤回傳值1。
- println!("...{}...{:?}", a, b); // {} 和{...}都是template-string。
rust支援concurrency。
使用mutex,並且此處顯示多執行緒的撰寫
all rust functions are thread-safe
loop{x = x * x;}
上文是loop語句
num library有複數。
Complex<T>{ re:T, //實部 im:T // 虛部 } Complex<f32> // 用f32存 let c = Complex{re: 0.24, im 0.3}; c.re == 0.24; c.im == 0.3; enum Option<T>{ None, Some(T), }
比較
result | option |
---|---|
Ok(x) | Some(x) |
Err(e) | None |
let x = (2,3) // tuple //x.0 == 2 第0個元素 //x.1 == 3 第1個元素
2.0 as f64 // 強制指定型別
crossbeam:建構concurrency的函式庫
- [derive(Debug)] // 用 {:?}可以做除錯
use regex::Regex; //使用regex
let regex = Regec::new(target)?; // ? 是使Error浮上的方式,類似if (Error){Error}{content; /* Ok(content)取出content */}
regex.replace_all(text, replacement).to_string() ↑&str ↑&str
Ch3 基本型別
Rust有型別推論和多型(解決鴨子型別,就是有函數或性質同名的就可執行,但是難以找到錯誤。Python、JS使用)
P.51列出範例型別
struct E; 類Unit型別
Box<A> 有指標指到heap裡面
&reference 參照
[f64; 4]矩陣
String 動態大小字串 "example".to_string()
Vec<f64> 可變長度矩陣
trait object:
引用到任何實作特定方法集合的值
&dyn Any, [value as &dyn Any,]
fn(&str) -> bool
Closure 沒有型別表達方式
|a, b| {a+b} enum Attend {OnTime, Late(u32)}
詳細說明 struct -> Ch9 enum -> Ch10 String and str -> Ch17 細節 trait -> Ch11 function & closure -> Ch14
基本數有u8, i8, u16, i16, u32, i32,u128, i128 f32, f64等
任意精度數在 num crate
char 不是u8也非u32
42u8, 1729isize ->數字後加型別,可以強制指定型別。
預設用i32
b'a' = 65u8 // byte literal
b'\ , b'\\', b'\n', b'\r', b'\t' -> 脫逸字元
b'\x1b' = 27 // (0x1b = 27,escape字元)
10_i8 as u16 -> 轉換到 u16