函数结构

函数要点

  • 函数名和变量名使用蛇形命名法(snake case),例如 fn add_two() -> {}
  • 函数的位置可以随便放,Rust 不关心我们在哪里定义了函数,只要有定义即可
  • 每个函数参数都需要标注类型

函数参数

Rust 是强类型语言,因此需要你为每一个函数参数都标识出它的具体类型,例如:

fn main() {
another_function(5, 6.1);
} fn another_function(x: i32, y: f32) {
println!("The value of x is: {}", x);
println!("The value of y is: {}", y);
}

another_function 函数有两个参数,其中 x 是 i32 类型,y 是 f32 类型,然后在该函数内部,打印出这两个值。这里去掉 x 或者 y 的任何一个的类型,都会报错:

参数-值传递

值传递 是把传递的变量的值传递给函数的 形参,所以,函数体外的变量值和函数参数是各自保存了相同的值,互不影响。因此函数内部修改函数参数的值并不会影响外部变量的值。

fn double_price(mut price:i32){
price=price*2;
println!("内部的price是{}",price)
} fn main() {
let mut price=99;
double_price(price); //输出 内部的price是198
println!("外部的price是{}",price); //输出 外部的price是99
}

参数-引用传递

值传递变量导致重新创建一个变量。但引用传递则不会,引用传递把当前变量的内存位置传递给函数。传递的变量和函数参数都共同指向了同一个内存位置。引用传递在参数类型的前面加上 & 符号。

fn double_price2(price:&mut i32){
*price=*price*2;
println!("内部的price是{}",price)
} fn main() {
let mut price=88;
double_price2(&mut price); //输出 内部的price是176
println!("外部的price是{}",price);//输出 外部的price是176
}

星号(* 用于访问变量 price 指向的内存位置上存储的变量的值。这种操作也称为 解引用。 因此 星号(* 也称为 解引用操作符

复合类型传参

对于复合类型,比如字符串,如果按照普通的方法传递给函数后,那么该变量将不可再访问。

fn show_name(name:String){
println!("充电科目 :{}",name);
} fn main() {
let name:String = String::from("从0到Go语言微服务架构师");
show_name(name);
println!("调用show_name函数后: {}",name);
} 报错如下
error[E0382]: borrow of moved value: `name`
let name:String = String::from("从0到Go语言微服务架构师");
|---- move occurs because `name` has type `String`, which does not implement the `Copy` trait
|show_name(name);
| ---- value moved here
|println!("调用show_name函数后: {}",name);
| ^^^^ value borrowed here after move

函数返回

函数在代码执行完成后,除了将控制权还给调用者之外,还可以携带值给它的调用者。函数可以返回值给它的调用者。称为 函数返回值

Rust 语言的返回值定义语法,在 小括号后面使用 箭头 ( -> ) 加上数据类型 来定义的。函数的返回值就是函数体最后一条表达式的返回值,当然我们也可以使用 return提前返回

  • return,返回retrun值
  • return,返回最末尾行的表达式值
  • 两种情况可以同时存在,如下代码所示
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);
}

plus_or_minus 函数根据传入 x 的大小来决定是做加法还是减法,若 x > 5 则通过 return 提前返回 x - 5 的值,否则返回 x + 5 的值。

无返回值

  • 函数没有返回值,那么返回一个 ()
  • 通过 ; 结尾的表达式返回一个 ()

永不返回的发散函数 !

发散函数(diverging function)绝不会返回。 它们使用 ! 标记,这是一个空类型。

fn foo() -> ! {
panic!("This call never returns.");
}

和所有其他类型相反,这个类型无法实例化,因为此类型可能具有的所有可能值的集合为空。 注意,它与 () 类型不同,后者只有一个可能的值。这种类型的主要优点是它可以被转换为任何其他类型,从而可以在需要精确类型的地方使用

Rust-函数的更多相关文章

  1. 2.3 Rust函数

    2.3 函数 [root@itoracle src]# cargo new functions Created binary (application) `functions` package [ro ...

  2. rust 函数-生命周期

    记录一下自己理解的生命周期. 每个变量都有自己的生命周期. 在c++里生命周期好比作用域, 小的作用域的可以使用大作用域的变量. 如果把这里的每个作用域取个名,那么就相当于rust里的生命周期注解. ...

  3. rust 函数的使用

    fn main() { println!("Hello, world!"); another_function(2,3); let y ={ let x =3; //表达式的结尾没 ...

  4. Rust <2>:函数、方法与注释的格式

    rust 函数定义格式如下: fn function_name(a: i64, b: u32, c: bool) -> (d: f64, e: &str) { ... (1, " ...

  5. Rust笔记

    前言: 学了有段时间了,现在同步到博客园. 正文: Rust语言介绍 l Rust由js之父开发的新型语言,打破了传统的难以接触底层的局面.这是个有C++开发的语言.拥有C的血统 l Rust必须严格 ...

  6. Rust到底值不值得学--Rust对比、特色和理念

    前言 其实我一直弄不明白一点,那就是计算机技术的发展,是让这个世界变得简单了,还是变得更复杂了. 当然这只是一个玩笑,可别把这个问题当真. 然而对于IT从业者来说,这可不是一个玩笑.几乎每一次的技术发 ...

  7. Rust学习笔记1

    这是一份不错的rust教程,目前包括4个block和4个project.全部完成后可以用rust实现一个简单的key-value存储引擎. 注意:Windows下rust貌似会遇到一些bug,强烈建议 ...

  8. 【译】Rust宏:教程与示例(二)

    原文标题:Macros in Rust: A tutorial with examples 原文链接:https://blog.logrocket.com/macros-in-rust-a-tutor ...

  9. Rust安装-运行第一个程序-hello_world

    Rust官网:https://rust-lang.org/ 安装 点击install,选择版本 选择相对应的版本进行下载 我这里下载的是windows系统,运行下载好的exe文件,根据需要选择选对应的 ...

  10. FinClip小程序+Rust(三):一个加密钱包

    ​ 一个加密货币钱包,主要依赖加密算法构建.这部分逻辑无关iOS还是Android,特别适合用Rust去实现.我们看看如何实现一个生成一个模拟钱包,准备供小程序开发采用 前言 在之前的内容我们介绍了整 ...

随机推荐

  1. NC20032 [HNOI2003]激光炸弹

    NC20032 [HNOI2003]激光炸弹 题目 题目描述 一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标. 现在地图上有 \(n\) (\(N ≤ 10000\))个目标,用整数 ...

  2. Note -「Dijkstra 求解 MCMF」

    食用前请先了解 SPFA + Dinic/EK 求解 MCMF. Sol. 总所周知,SPFA 牺牲了.于是我们寻求一些更稳定的算法求解 MCMF. 网络流算法的时间属于玄学,暂且判定为混乱中的稳定. ...

  3. C++ 加速(卡常)技巧【超级 快读、快写】

    C++ \texttt{C++} C++ 加速技巧 快读快写 快读 inline int read() { int x = 0, w = 0; char ch = 0; while (!isdigit ...

  4. 表单中设置了 `keyup.enter.native` 的按键事件,但是回车后没有执行查询,反而会刷新页面

    场景 添加属性对话框中,input输入后点击 enter,不会执行绑定的 handleDialogQuery 事件,反而会刷新整个页面: 如果不点击 enter,点击搜索按钮,则是正常的. 又测试:在 ...

  5. iframe 标签

    iframe是一个内联框架,可以在当前HTML页面中嵌入另一个文档,一般情况下使用iframe直接在页面嵌套iframe标签再指定src就可以了. iframe 的常用属性: name : 规定 &l ...

  6. React报错之组件不能作为JSX组件使用

    正文从这开始~ 总览 组件不能作为JSX组件使用,出现该错误有多个原因: 返回JSX元素数组,而不是单个元素. 从组件中返回JSX元素或者null以外的任何值. 使用过时的React类型声明. 返回单 ...

  7. 安卓手机如何无线连接adb?

    一般情况,大家adb调试手机,都是通过数据线的,但这样又是不太方便,所以我们可以通过WLAN来adb. 我的是华为手机,进入:设置-关于手机,连续点击版本号,唤出开发者模式.然后去返回设置-系统和更新 ...

  8. Mqtt开发笔记:windows下C++ ActiveMQ客户端介绍、编译和使用

    前话   项目需求,需要使用到mqtt协议,之前编译QtMqtt库,不支持队列模式queue(点对点),只支持订阅/发布者模式.,所以使用C++ ActiveMQ实现.   MQTT协议 简介   M ...

  9. Nginx 限制上传文件的大小。responded with a status of 413 (Request Entity Too Large)

    # 限制请求体的大小,若超过所设定的大小,返回413错误. client_max_body_size 50m; # 读取请求头的超时时间,若超过所设定的大小,返回408错误. client_heade ...

  10. 手把手教你分析MySQL查询性能瓶颈,包教包会

    当一条SQL执行较慢,需要分析性能瓶颈,到底慢在哪? 我们一般会使用Explain查看其执行计划,从执行计划中得知这条SQL有没有使用索引?使用了哪个索引? 但是执行计划显示内容不够详细,如果显示用到 ...