函数结构

函数要点
- 函数名和变量名使用蛇形命名法(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.");
- }
复制代码 和所有其他类型相反,这个类型无法实例化,因为此类型可能具有的所有可能值的集合为空。 注意,它与 () 类型不同,后者只有一个可能的值。这种类型的主要优点是它可以被转换为任何其他类型,从而可以在需要精确类型的地方使用
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |