Rust知识篇04-函数
函数认识
最普通的函数
javascript
fn add(i: i32, j: i32) -> i32 {
i + j
}
上面函数包含了
javascript
声明函数的关键字 fn
函数名 add()
参数 i 和 j
参数类型和返回值类型 i32
函数命名规则
函数名和变量名使用蛇形命名法(snake case)
javascript
// 例如
fn add_two() {}
函数参数
Rust 是静态类型语言,因此需要你为每一个函数参数都标识出它的具体类型
javascript
fn main() {
let _a = 8;
let _b =add(5,6);
println!("{}",_b);
}
fn add(a,b: i32) -> i32 {
a + b
}
//报错
🍎上面缺失类型报如下
javascript
error: expected one of `:`, `@`, or `|`, found `,`
--> src\main.rs:28:9
|
28 | fn add(a,b: i32) -> i32 {
| ^ expected one of `:`, `@`, or `|`
|
= note: anonymous parameters are removed in the 2018 edition (see RFC 1685)
help: if this is a `self` type, give it a parameter name
|
28 | fn add(self: a,b: i32) -> i32 {
| +++++
help: if this is a parameter name, give it a type
|
28 | fn add(a: TypeName,b: i32) -> i32 {
| ++++++++++
help: if this is a type, explicitly ignore the parameter name
|
28 | fn add(_: a,b: i32) -> i32 {
🍎补充类型以后正常使用
javascript
fn main() {
let _a = 8;
let _b =add(5,6);
println!("{}",_b);
}
fn add(a: i32,b: i32) -> i32 {
a + b
}
// 输出11
🍎动态类型语言(动态类型系统)
不需要显式地声明变量的类型,变量的类型会在程序运行时根据其值自动推断或改变
javascript
JavaScript、Python、Ruby
🍎静态类型语言
类型在编译时就已经确定,编译器会检查类型的一致性,避免类型错误。
javascript
C、Java、Rust
函数返回
返回值可以是表达式的返回值,也可以使用 return
提前返回
javascript
fn plus_or_minus(x:i32) -> i32 {
if x > 5 {
return x - 5
}
x + 5
}
fn main() {
let x = plus_or_minus(5);
println!("The value of x is: {}", x);
}
🍎无返回值()
单元类型 ()是一个零长度的元组。可以用来表达一个函数或表达式没有返回有意义的值
没有 return
语句,Rust 函数也会返回 ()
类型
javascript
fn main() {
let x = { // 这个块表达式没有返回有意义的值
println!("Hello from block!");
};
// 由于块没有返回值,它的返回类型是 `()`
println!("{:?}", x); // 输出: ()
}
🍎永不返回的发散函数!
用 !
作函数返回类型的时候,表示该函数永不返回( diverging functions )
下面是一个典型的发散函数是一个无限循环,它永远不会返回
javascript
fn loop_forever() -> ! {
loop {
println!("This loop will run forever!");
}
}
fn main() {
// 由于 loop_forever() 永不返回,下面的代码将无法执行到
loop_forever();
println!("This will never be printed!");
}
//输出
This loop will run forever!
最后输出一行
error:
process didn't exit successfully:
(exit code: 0xc000013a, STATUS_CONTROL_C_EXIT)