iT邦幫忙

2

二、三天學一點點 Rust:來!方法、字串與浮點數(8)

  • 分享至 

  • xImage
  •  

🧠 Rust 方法(method)總整理筆記

方法是一種「定義在型別上的函式」,我們可以透過 . 的方式呼叫。

✅ 常見內建方法(built-in methods)

📋 整數與字串常用方法對照表

方法 (method) 適用型別 說明 範例輸出
.abs() 整數、浮點數 回傳絕對值 (-15).abs() → 15
.pow(n) 整數、浮點數 次方運算(n 為指數) 2.pow(3) → 8
.trim() &str 去除字串開頭與結尾的空白字元 " hi ".trim() → "hi"
.to_uppercase() &str 字串轉大寫 "rust".to_uppercase() → "RUST"
.to_lowercase() &str 字串轉小寫 "RUST".to_lowercase() → "rust"
.len() &str, Vec 長度(字串長度 / 向量元素個數) "abc".len() → 3
.is_empty() &str, Vec 判斷是否為空 "".is_empty() → true
.contains("a") &str 判斷是否包含某個子字串 "rustacean".contains("ace")
.replace("a", "b") &str 取代字串 "abc".replace("a", "x") → "xbc"
.push_str("abc") String 在字串後方加字串(需是 String)

🧠 方法小提醒:

  • 方法是呼叫在「值」上的函式,用 value.method() 形式呼叫
  • &str 是不可變字串,需轉為 String 才能使用某些方法(例如 .push_str())
let name: &str = "abc";
println!("{}", name.push_str("abc"));

no method named `push_str` found for reference `&str` in the current scope 竟然出現錯誤!

想說每個都試一下,發現這個方法不單純。

🧠 原因是:
.push_str() 是 String 型別的方法,不是 &str 的方法。

  • &str 是不可變的字串切片(string slice)
  • String 是可變的堆疊字串型別
  • 只有 String 才可以使用 .push_str() 來追加字串
  • String,第一字是大寫…
let mut name = String::from("abc");
println!("{}", name.push_str("abc"));

error[E0277]: `()` doesn't implement `std::fmt::Display` //📛 錯誤訊息

再度嘗試,再度犯錯…

🧠 原來是因為:

  • .push_str() 是一個**執行副作用(修改字串)**的函數
  • 它不會回傳任何值,回傳的是 ()(空的 tuple,代表「沒有東西」)
  • 我把它當成有值的東西要 println! 印出來,這就出錯了

✅ 正確寫法

fn main() {
    let mut name = String::from("abc"); // 注意:要是 String,而且要是 mut
    name.push_str("def");
    println!("{}", name); // 輸出:abcdef
}

String::from() → 建立一個新的 String 物件
mut name → 要使用 .push_str(),變數必須可變
.push_str() → 在原來的 String 後面追加內容

🧪 Rust 浮點數處理與格式化輸出

🧠 程式碼解析

fn main() {
    let pi1: f32 = 3.1415926535897932384;
    let pi2: f64 = 3.1415926535897932384;
    println!("{}", pi1);
    println!("{}", pi2.floor());
    //印出 pi2 的**向下取整(floor)**結果,即不大於 pi2 的最大整數(3.0)。
    println!("{}", pi2.ceil());
    //印出 pi2 的**向上取整(ceil)**結果,即不小於 pi2 的最小整數(4.0)。
    println!("{}", pi2.round());
    //印出 pi2 的四捨五入結果(round),應該為 3.0。
    println!("The current value of pi2 is {:.2}", pi2);
    //使用格式化輸出:.2 表示「顯示到小數點後兩位」,所以結果是:3.14。
    //"{:.2}" 是格式化規範(format specifier)。
}
    let pi1: f32 = 3.1415926535897932384;
  • 宣告一個變數 pi1,型別是 f32(單精度浮點數)。
  • 數值超過 f32 的精度限制,會被自動截斷(f32 約能保留 6~7 位有效數字)。
    let pi2: f64 = 3.1415926535897932384;
  • 宣告一個變數 pi2,型別是 f64(雙精度浮點數)。
  • 相較 f32,f64 可保留更多有效位數(約 15~17 位)。

其餘常見如下:

🔧 Rust 浮點數常見方法(f32 / f64)

方法 說明 範例輸出
.trunc() 截斷小數部分(直接捨去小數點後) 3.99_f64.trunc()3.0
.sqrt() 開平方根 9.0_f64.sqrt()3.0
.powf(n) 浮點數次方 2.0_f64.powf(3.0)8.0
.is_nan() 判斷是否為 NaN(非數值) f64::NAN.is_nan()true
.is_infinite() 判斷是否為正無限大或負無限大 f64::INFINITY.is_infinite()true

⚠️ Rust 浮點數錯誤處理與常見陷阱

Rust 的浮點數處理非常嚴謹,但仍有一些陷阱要注意,這裡整理常見誤區、例外情況與檢查方法。


📌 常見浮點數錯誤與陷阱整理表

類型 範例程式碼 結果 / 錯誤 解法與說明
除以 0 let x = 1.0 / 0.0; INFINITY 浮點數除以 0 不會 panic,會回傳無限大
無意義運算 let x = 0.0 / 0.0; NaN 結果為非數值 NaN(Not a Number)
比較浮點數相等性 0.1 + 0.2 == 0.3 false 精度誤差,建議用誤差範圍判斷(見下)
精度誤差(陷阱) println!("{}", 0.1 + 0.2); 輸出為 0.30000000000000004 浮點數在底層是二進位,會有精度誤差

🧪 如何安全比較浮點數?

let a = 0.1 + 0.2;
let b = 0.3;
let epsilon = 0.00001;
if (a - b).abs() < epsilon {
    println!("Almost equal!");
// 如果 a 與 b 的差異小到可以忽略(小於 epsilon),我們就當作它們相等。    
}
  • ✅ 透過「允許誤差(epsilon)」的方式比對浮點數
  • ❌ 不要用 == 判斷小數是否相等

🔖 epsilon 是什麼?

epsilon 是一個「可以接受的誤差範圍」,通常值選得「夠小但不為 0」,例如 0.00001、1e-6,實務上依據你的應用情境來調整(科學計算 vs UI 顯示)。

關於浮點數、整數的方法等,還是等課程有深度討論再繼續。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言