首页 > 其他分享 >Rust-函数

Rust-函数

时间:2022-09-22 09:37:52浏览次数:60  
标签:函数 price 类型 Rust println fn name

函数结构

image

函数要点

  • 函数名和变量名使用蛇形命名法(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.");
}

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

标签:函数,price,类型,Rust,println,fn,name
From: https://www.cnblogs.com/wanna2leo/p/16621527.html

相关文章

  • 凸函数与优化
    讲的比较透彻,关于凸函数的定义、性质、在优化中的优势from: https://zhuanlan.zhihu.com/p/56876303凸函数定义一个函数 f:Rn→R 是一个凸函数,当且仅当以上两个条件......
  • TypeScript 函数重载
    函数参数的类型可以使用联合类型?,让我们传递的值可以有多种类型的情况。下面是写的一个简单函数,参数x可以有number、string两种类型,返回值也是。functionreverse(x:......
  • Python之numpy库(二)-函数
    1.算术函数  如果参与运算的两个对象都是ndarray,并且形状相同,那么会对位彼此之间进行(+-*/)运算。NumPy算术函数包含简单的加减乘除:add(),subtract(),multiply()......
  • T1051 分段函数(信息学一本通C++)
     目录 [题目描述]编写程序,计算下列分段函数y=f(x)的值。 y=-x+2.5;0<=x<5 y=2-1.5(x-3)(x-3);5<=x<10 y=x/2-1.5;10<=x<20[输入]一个浮点数N......
  • 有关损失函数推导
    损失函数推导线性回归首先损失函数是为了衡量模型预测的数据与真实数据之间的区别,那么问题来了为什么是平方损失,而不是绝对值损失,四次方损失。一个很浅显的理解:二次方简......
  • 逻辑回归函数
    SigmoidFunctionLogisticFunction:\(S(x)=\frac{1}{1+e^{-x}}\)(\(S(0)=\frac{1}{1+1}=0.5\))Hyperbolictangent\(f(x)=tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}\)......
  • const修饰成员函数,常函数,常对象
    设计关键字:const、mutable常函数:-成员函数后面加const,就是常函数-常函数里面不能修改成员变量的值-成员变量加mutable修饰,在常函数中可以修改 常对象:-声明对象......
  • 【SQL 编程你也行】SQL Server 2012新功能之函数:转换函数
    在SQLServer2012中,新增了几个转换函数,用于支持数据类型的强制转化。由于之前主要用的是SQLServer2008R2,而公司的项目为了提高开发效率,很多表的列都为varchar类型,但也......
  • MySQL索引查询条件使用函数导致索引失效
     索引失效EXPLAINSELECTdt.nameASdeviceName,su.`name`ASuserName,date_format(co.upload_time,'%Y%m%d')astimeFROMtb_cust_ordercoI......
  • 寄存器与函数栈帧
    每一个函数独占自己的栈帧空间。当前正在运行的函数的栈帧总是在栈顶。Win32系统提供两个特殊的寄存器用于标识位于系统栈顶端的栈帧。(1)ESP:栈指针寄存器(extendedstackp......