方法是一種「定義在型別上的函式」,我們可以透過
.
的方式呼叫。
方法 (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) |
🧠 方法小提醒:
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 的方法。
let mut name = String::from("abc");
println!("{}", name.push_str("abc"));
error[E0277]: `()` doesn't implement `std::fmt::Display` //📛 錯誤訊息
再度嘗試,再度犯錯…
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 後面追加內容
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;
let pi2: f64 = 3.1415926535897932384;
其餘常見如下:
方法 | 說明 | 範例輸出 |
---|---|---|
.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 |
類型 | 範例程式碼 | 結果 / 錯誤 | 解法與說明 |
---|---|---|---|
除以 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 是一個「可以接受的誤差範圍」,通常值選得「夠小但不為 0」,例如 0.00001、1e-6,實務上依據你的應用情境來調整(科學計算 vs UI 顯示)。
關於浮點數、整數的方法等,還是等課程有深度討論再繼續。