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)
相关推荐
考虑考虑3 小时前
JDK26中的List.ofLazy()
java·后端·java ee
小蒜学长3 小时前
基于SpringBoot的公寓报修管理系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·公寓报修管理系统·多角色协同
云浪3 小时前
Go源码分析:搞懂 Go 是如何实现堆的
后端·go·源码阅读
用户033307413956 小时前
TypeScript using 与 AsyncDisposableStack:在真实服务端代码中协调多资源清理
前端
daisychey6 小时前
用 Playwright 做多平台内容分发,我踩过的 8 个坑
前端
调试人生的显微镜6 小时前
iOS开发入门:Interface Builder、基础控件及UITextField详解
后端·ios
泡海椒6 小时前
巡检照片与工单附件:jquick-pdf 图片嵌入的业务实战
后端
蜗牛互联网7 小时前
Python消费Responses SSE事件:增量文本、超时与取消
java·开发语言·人工智能·后端·python
AI持续学习7 小时前
文档权限变更如何回归测试?账号、空间、文件和分享链接用例清单
后端
谢亮_vipxieliang7 小时前
Go Worker Pool 设计——从原理到生产级实现
开发语言·后端·golang