blog.dopana

Back

Rust入门系列第四篇。函数是你命名和复用逻辑的方式。Rust 的函数很简单——关键在于几乎一切都是表达式。

第一个函数#

fn add(a: i32, b: i32) -> i32 {
    a + b
}

fn main() {
    let result = add(3, 4);
    println!("{result}");   // 7
}
rust

参数声明类型;返回类型写在 -> 后面。

语句与表达式#

语句执行一个动作且不返回任何值。表达式求值为一个值。

fn add(a: i32, b: i32) -> i32 {
    let sum = a + b;   // 语句,以分号结尾
    sum                // 表达式,无分号
}
rust

最后一个表达式——不带分号——就是返回值。如果加上分号,函数就返回 ()

提前返回#

return 提前退出:

fn is_adult(age: u32) -> bool {
    if age >= 18 {
        return true;
    }
    false
}
rust

无返回值#

不产生任何值的函数具有单元类型 ()

fn greet(name: &str) {
    println!("Hello, {name}!");
}
rust

隐式返回类型是 ()

传递所有权#

默认情况下,把值传给函数会移动它(详见下一篇所有权):

fn print_len(s: String) {
    println!("{}", s.len());
}

fn main() {
    let s = String::from("hello");
    print_len(s);   // s 被移动
    // println!("{s}");  // 错误:s 已不存在
}
rust

泛型函数#

函数可以用尖括号对类型泛型化:

fn first<T>(list: &[T]) -> &T {
    &list[0]
}
rust

T 代表任意类型。编译器会从调用处推断。

结论#

Rust 函数自始至终都是表达式:参数有类型,最后一个表达式是返回值,所有权随值传递。本系列下一篇:所有权。

参考资料#