Rust-函数

[复制链接]
发表于 2022-9-22 09:43:48 | 显示全部楼层 |阅读模式
函数结构


函数要点


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

Rust 是强类型语言,因此需要你为每一个函数参数都标识出它的具体类型,例如:
  1. fn main() {
  2.     another_function(5, 6.1);
  3. }
  4. fn another_function(x: i32, y: f32) {
  5.     println!("The value of x is: {}", x);
  6.     println!("The value of y is: {}", y);
  7. }
复制代码
another_function 函数有两个参数,其中 x 是 i32 类型,y 是 f32 类型,然后在该函数内部,打印出这两个值。这里去掉 x 或者 y 的任何一个的类型,都会报错:
参数-值传递

值传递 是把传递的变量的值传递给函数的 形参,所以,函数体外的变量值和函数参数是各自保存了相同的值,互不影响。因此函数内部修改函数参数的值并不会影响外部变量的值。
  1. fn double_price(mut price:i32){
  2.     price=price*2;
  3.     println!("内部的price是{}",price)
  4. }
  5. fn main() {
  6.     let mut price=99;
  7.     double_price(price); //输出 内部的price是198
  8.     println!("外部的price是{}",price); //输出 外部的price是99
  9. }
复制代码
参数-引用传递

值传递变量导致重新创建一个变量。但引用传递则不会,引用传递把当前变量的内存位置传递给函数。传递的变量和函数参数都共同指向了同一个内存位置。引用传递在参数类型的前面加上 & 符号。
  1. fn double_price2(price:&mut i32){
  2.     *price=*price*2;
  3.     println!("内部的price是{}",price)
  4. }
  5. fn main() {
  6.     let mut price=88;
  7.     double_price2(&mut price); //输出 内部的price是176
  8.     println!("外部的price是{}",price);//输出 外部的price是176
  9. }
复制代码
星号(*) 用于访问变量 price 指向的内存位置上存储的变量的值。这种操作也称为 解引用。 因此 星号(*) 也称为 解引用操作符
复合类型传参

对于复合类型,比如字符串,如果按照普通的方法传递给函数后,那么该变量将不可再访问。
  1. fn show_name(name:String){
  2.     println!("充电科目 :{}",name);
  3. }
  4. fn main() {
  5.     let name:String = String::from("从0到Go语言微服务架构师");
  6.     show_name(name);
  7.     println!("调用show_name函数后: {}",name);
  8. }
  9. 报错如下
  10. error[E0382]: borrow of moved value: `name`
  11. let name:String = String::from("从0到Go语言微服务架构师");
  12.   |---- move occurs because `name` has type `String`, which does not implement the `Copy` trait
  13.   |show_name(name);
  14.   |  ---- value moved here
  15.   |println!("调用show_name函数后: {}",name);
  16.   |  ^^^^ value borrowed here after move
复制代码
函数返回

函数在代码执行完成后,除了将控制权还给调用者之外,还可以携带值给它的调用者。函数可以返回值给它的调用者。称为 函数返回值
Rust 语言的返回值定义语法,在 小括号后面使用 箭头 ( -> ) 加上数据类型 来定义的。函数的返回值就是函数体最后一条表达式的返回值,当然我们也可以使用 return提前返回

  • 有return,返回retrun值
  • 无return,返回最末尾行的表达式值
  • 两种情况可以同时存在,如下代码所示
  1. fn plus_or_minus(x:i32) -> i32 {
  2.     if x > 5 {
  3.         return x - 5
  4.     }
  5.     x + 5
  6. }
  7. fn main() {
  8.     let x = plus_or_minus(5);
  9.     println!("The value of x is: {}", x);
  10. }
复制代码
plus_or_minus 函数根据传入 x 的大小来决定是做加法还是减法,若 x > 5 则通过 return 提前返回 x - 5 的值,否则返回 x + 5 的值。
无返回值


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

发散函数(diverging function)绝不会返回。 它们使用 ! 标记,这是一个空类型。
  1. fn foo() -> ! {
  2.     panic!("This call never returns.");
  3. }
复制代码
和所有其他类型相反,这个类型无法实例化,因为此类型可能具有的所有可能值的集合为空。 注意,它与 () 类型不同,后者只有一个可能的值。这种类型的主要优点是它可以被转换为任何其他类型,从而可以在需要精确类型的地方使用

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表