函式

函式 在 Rust

1 個練習

關於 函式

函式是一段程式碼,內含一個或多個敘述或運算式。函式可以選擇性地回傳值。

Rust 的風格是函式名稱使用蛇形命名法,並在函式定義前加上 fn 關鍵字。例如:

fn do_nothing() {}

括號內為零個或多個以逗號分隔的參數。參數是將某個特定型別的值綁定起來,並傳入函式中。即使沒有任何參數,函式定義中仍然必須要有括號。實際傳入參數的值稱為引數。

參數與回傳值的組合稱為函式的簽章。函式的簽章要求每個參數都必須標註型別。

大括號包住函式的主體:也就是它的敘述與運算式。即使函式中沒有任何敘述或運算式,函式定義仍然必須要有大括號。

在以下範例中,函式接受一個型別為 i32 的參數,將它綁定到名稱 value,然後印出它。

fn print_integer(value: i32) {
    println!("{value:?}");
}

注意參數的定義方式。每個參數都以 name: Type 的格式定義。

函式也可以回傳值。預設情況下,會回傳最後一個運算式的輸出。在以下範例中,函式有一個 i32 參數,並回傳它的兩倍。

fn double_integer(value: i32) -> i32 {
    value * 2
}

-> i32 表示函式會回傳 i32。與參數不同的是,回傳值並沒有名稱。

可以使用 return 關鍵字提前離開函式,像這樣:

fn long_function() -> i32 {
    let some_condition = false;
    // code snipped
    if (some_condition) {
        return 0;
    }
    // more code snipped
    42
}

const fn 用來定義常數函式,常數函式可以在編譯期求值。

const fn compute_data_checksum() -> u128 {
  const DATA: &[u8] = include_bytes!("my_big_data_file");
  // checksum implementation is left as an exercise for the reader
}

/// This checksum is used to validate that the user has not tampered with proprietary configuration.
pub const DATA_CHECKSUM: u128 = compute_data_checksum();

由於常數函式可能在編譯期求值,因此它們有一些一般函式沒有的限制。特別是 const fn 只能呼叫同樣標記為 const 的其他函式。不遵守這項限制會導致編譯錯誤。

const fn multiply_integer(value: i32) -> i32 {
    use std::time::SystemTime;
    if SystemTime::now().elapsed().unwrap().as_nanos() == 0 { // this line errors
        value * 2
    } else {
        value * 3
    }
}

另外還有匿名函式,會在 closures 主題中介紹。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟