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)
相关推荐
zzzzzz3104 分钟前
别急着把动效组件搬进页面:从 react-bits 看 React 动效库该怎么评估
前端·react.js·开源
李姆斯7 小时前
为啥Agent在coding表现这么好,但是在别的领域就是差的不少?
前端·agent·ai编程
笃行3509 小时前
向量数据库单独建一套,这笔账划不划算
后端
weixin_431600449 小时前
Agent Workflow 学习向:Code 节点,比模板更强的变量加工
后端·python·学习·ai·
Rain的Java大神之路10 小时前
短信接口被狂刷怎么处理
java·运维·后端·web安全·面试·架构·xss
鱼与宇10 小时前
前端Web(html+css+js+vue3)
前端
Lost of 程序猿10 小时前
AOP 实战:面向切面编程从理论到落地
后端·asp.net·aop·面向切片变成
Lost of 程序猿11 小时前
ASP.NET Core 认证授权实战:从 JWT 到 Policy,设计一套企业级 RBAC 权限系统
后端·asp.net
Lost of 程序猿11 小时前
ASP.NET Core 后台任务全景:从 BackgroundService 到 Channel 队列,再到分布式调度
后端·asp.net·.netcore
倾颜11 小时前
NestJS 核心概念梳理:从 Module、Controller 到 Guard、Interceptor
后端·node.js·nestjs