iT邦幫忙

0

二、三天學一點點 Rust:來!Functions(13)

  • 分享至 

  • xImage
  •  

🧠 函式(Function):定義、參數、呼叫一次搞懂

在 Rust 中,函式(function) 是用來封裝一組可重複執行的指令步驟。
你可以將重複的邏輯寫成函式,在需要的時候「呼叫」它,讓程式碼更乾淨、可讀性更高!


📘 範例程式碼

fn main() {
    open_store("NewYork");
    bake_pizze(12, "pepperoni");
    swim_in_profit();
    open_store("Brooklyn");
}

fn open_store(neighborhood: &str) {
    println!("Opening my pizza store in {}.", neighborhood);
}

fn bake_pizze(number: i32, topping: &str) {
    println!("Baking {} {} pizza.", number, topping);
}

fn swim_in_profit() {
    println!("So much $$$, so little time.");
}

🔍 程式碼說明

函式名稱 功能描述
open_store() 接收一個地區名稱,印出開店訊息。
bake_pizze() 接收數量與配料,印出正在烘焙的披薩種類。
swim_in_profit() 沒有參數,印出財富的誇張語句。
main() Rust 的進入點函式,依序呼叫其他函式。

📦 函式定義 vs 呼叫重點比較

名詞 說明 範例
函式定義 宣告一個函式的名稱、參數、與執行內容 fn open_store(neighborhood: &str) { ... }
參數(parameter) 函式定義中預期的輸入變數 neighborhood: &str
引數(argument) 實際呼叫函式時傳入的值 "NewYork"
函式呼叫 在程式中使用函式,並傳入對應參數的引數 open_store("NewYork");

✅ 小結

  • fn 是函式的定義關鍵字。
  • 函式可以接受參數(parameter),讓它執行時更具彈性。
  • 呼叫函式時,要傳入對應的引數(argument)。
  • 主函式 main() 是 Rust 程式的入口,其他函式可以在裡面依序執行

🧠 函式回傳值(Return Value)

在 Rust 中,函式(function)不只可以執行一連串操作,還可以「回傳一個值」給呼叫者。
這個值被稱為:回傳值(return value)


📘 範例程式碼

fn main() {
    let result = square(5);
    println!("The square of 5 is {}.", result);

    let result = square(12);
    println!("The square of 12 is {}.", result);
}

fn square(number: i32) -> i32 {
    return number * number;
}

🧩 程式碼說明

部分 說明
fn square(number: i32) 定義一個函式名稱為 square,參數為一個 i32 整數。
-> i32 表示這個函式會回傳一個 i32 型別的值
return number * number; 使用 return 回傳運算結果。
let result = square(5); 呼叫函式並接收回傳值到變數 result

另外如果把square函式寫成:

fn square(number: i32) -> i32 {
    number * number
}

在 Rust 中,函式的最後一行如果是「沒有分號的表達式」,它會被自動作為回傳值。這就叫做:
✅ Implicit Return(隱式回傳)
不用寫 return,Rust 會自動把最後一行「沒加分號的表達式」當作回傳值。
✅ Explicit Return(顯式回傳)
就是使用 return 關鍵字明確指定回傳值,後面要加分號 ;

🧠 Rust 的 Unit 類型:() 是什麼?有什麼用?

在 Rust 中,有一種非常特別的型別叫做 Unit 型別,寫作 (),而()是一個合法的型別(不像 JavaScript 的 undefined),它表示:無回傳值、無內容,但仍代表「這個運算已完成」。

當然它不是空的陣列,也不是空的字串,而是:

✅ 一個 沒有值的元組(tuple without values),也被稱為「單元值」。


📘 程式範例

fn main() {
    let _result = mystery(); // _result 的型別是 ()
}

fn mystery() {
    // 沒有回傳值,也沒用 return,Rust 自動回傳 ()
}

即使 mystery() 函式裡什麼都沒做,它還是會自動回傳 (),這就是 Rust 的 Unit 型別。

🧠 用途與特性整理

特性 說明
型別名稱 ()(讀作 unit 或 unit type)
語意 表示「什麼都不需要回傳,但有完成一件事」
自動產生 如果函式沒明確回傳值,Rust 會自動補上 ()
對應語言概念 類似 Python 的 None、JavaScript 的 undefinedvoid
可當作佔位值 可作為 Result<(), Error> 中的成功型別表示「成功但無額外資料」

✅ 補充:什麼時候會用到 Unit?

1.函式沒有回傳值時:

fn log_info(message: &str) {
    println!("{}", message);
    // 自動回傳 ()
}

2.用作成功但沒有值的訊號:

fn try_something() -> Result<(), String> {
    if true {
        Ok(())
    } else {
        Err("Something went wrong.".to_string())
    }
}

3.作為測試副作用的函式:

fn do_nothing() {}

🧱 Block(區塊)教學:不只是包起來那麼簡單!

在 Rust 中,區塊(block) 是使用大括號 {} 括起來的一段程式碼。
它不僅用來包裹語句(statement),更是一個「表達式(expression)」,可以回傳值!


📘 範例程式碼

fn main() {
    let multiplier = 3;

    let calculation = {
        let value = 5 + 4;
        value * multiplier
    };

    println!("{}", calculation); // ➜ 27
}

🧩 程式解析

區塊部分 說明
let multiplier = 3; 宣告一個變數,在區塊外部定義,可在區塊內部使用
{ ... } 一個 block,裡面可以執行多行程式碼(語句)
let value = 5 + 4; 區塊內部的變數,只在 block 內有效(區域作用域)
value * multiplier block 的最後一行是表達式,它的值會成為整個 block 的回傳值
let calculation = { ... }; 這行就是將 block 的「結果值」賦給變數 calculation

✅ 最後印出 calculation,結果是:9 × 3 = 27

🧠 Block 的用途與特性

特性 說明
是一個「表達式」 Rust 的 block { ... } 最後一行沒加分號,會當作回傳值
可以賦值給變數 let x = { ... } 的寫法成立,因為 block 是一種有值的表達式
有自己的作用域(scope) 在 block 中用 let 宣告的變數,只在區塊中有效,不會污染外部變數命名空間
結構靈活、便於拆解邏輯 可用來包裝一段局部運算、前置邏輯、條件運算等

✅ Block 回傳值的規則

寫法 結果
最後一行是表達式、無分號 該值被回傳
最後一行加了分號 value * 3; 回傳 ()(Unit)
使用 return 明確回傳 提前結束、回傳指定值

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

尚未有邦友留言

立即登入留言