Rust知识篇04-函数

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)
相关推荐
n8n5 分钟前
Spring AI 检索增强生成(RAG)实战:让模型掌握你的私有知识
后端
Nturmoils17 分钟前
只备份一个 schema,别把整库都搬走
后端
OpenTiny社区22 分钟前
码力全开,智启前端新生态|OpenTiny 登陆华为全联接大会2026
前端·github
妙码生花23 分钟前
利用AI从零学Go并完成实战项目,完工总结:目录结构
前端·后端·go
妙码生花26 分钟前
利用AI从零学Go并完成实战项目,完工总结:商业级开源产品定位和核心特性介绍
前端·后端·go
程序员cxuan37 分钟前
GPT-6 Astra 的提示词泄露了,里面居然藏着个保安?
人工智能·后端·程序员
苍何1 小时前
WorkBuddy + 飞书的 8 种神仙用法(建议收藏)
后端
Captaincc1 小时前
掘金AI用量统计v0.1.0大更新-支持桌面宠物自定义和订阅额度卡片
前端·后端
默_笙1 小时前
🚲 从写信到打电话:WebSocket 双工通信与跨域方案的"通信进化史"
前端·javascript
大哥43092 小时前
AI 接口高并发 ≠ 秒杀高并发:为什么我把并发闸门挂在 LLM 调用汇聚点
后端