函数作为rust 基本类型中的最后一个,是的他也是基本类型。所以我们可以推测出第一点:
形如:
fn zry(z:i32,r:i32,y:i32) -> i32 {...} // 注意这里没有分号采用的是表达式写法。
let z = zry(1,2,3);
的赋值方式是合理的。
这点对于C++ 程序员来说是一个很有意思的点,我们不需要设定函数返回类型是函数指针然后通过回调函数去调用了。现在直接一点,我们关注并发下的逻辑本身。
接下来让我们聊聊之前不常说的返回值部分。
函数返回
rust 中的返回类型分以下几种
- 正常返回
- 表达式
- return 返回
- 规定类型返回
- 特殊返回
- 单元类型返回
- 不返回(牛不牛,不返回,也是一种返回。堪比 那句:你不会所以你会。)
好了接下来让我们介绍这几种具体返回类型。
- 表达式返回:
fn zry(z:i32,r:i32,y:i32) {
z+r+y
} // 注意这里没有分号采用的是表达式写法。
let z = zry(1,2,3); // z = 6
- return 返回
fn zry(z:i32,r:i32,y:i32) -> i32 {
return z+r+y;
}
let z = zry(1,2,3); // z = 6
- 规定类型返回
fn zry(z:i32,r:i32,y:i32) -> i32 {// 注意这里规定了返回类型,而表达式返回没有。
z+r+y;
}
let z = zry(1,2,3); // z = 6
- 单元类型返回
fn main() {
use std::fmt::Debug;
fn report<T: Debug>(item: T) {
println!("{:?}", item);
}
}
或者显示声明
fn main() {
fn clear(text: &mut String) -> () {
*text = String::from("");
}
}
- 最牛逼的永不返回的返回
- 当用
!
作函数返回类型的时候,表示该函数永不返回( diverge function ),特别的,这种语法往往用做会导致程序崩溃的函数:
- 当用
fn main() {
fn dead_end() -> ! {
panic!("探索永不停歇!");
}
}
fn main() {
fn forever() -> ! {
loop {
//...
};
}
}
在Rust中,使用!
作为函数的返回类型表示该函数是一个"diverge function",即该函数永远不会返回。这种机制在Rust中有一些实际的使用意义。
-
Panic:当函数遇到无法处理的错误或异常情况时,可以选择使用
panic!
宏来触发panic。由于panic会导致程序的非正常终止,所以panic的函数可以使用!
作为返回类型,表示它们永远不会返回。 -
循环:有时候需要编写一个无限循环的函数,例如一个服务器的主循环或一个事件处理循环。这些函数可以使用
loop
语句来创建一个无限循环,并使用!
作为返回类型,表示它们永远不会返回。 -
库函数:在某些情况下,库函数可能需要在特定条件下终止程序的执行,例如在某些安全检查失败时。这些函数可以使用
!
作为返回类型,表示它们永远不会返回。
使用!
作为函数的返回类型可以帮助编译器进行静态分析和检查,以确保程序的正确性。如果一个函数被声明为返回!
类型,但实际上却返回了一个值,编译器会发出警告或错误。这有助于避免潜在的错误和逻辑问题。
需要注意的是,!
类型是Rust中的一个特殊类型,它是所有类型的子类型。这意味着可以将!
类型的值转换为任何其他类型的值,但反过来是不可能的。因此,!
类型的函数可以用作任何其他类型的函数的替代品。