Rust学习教程14 - 函数

Posted 孙飞 Sunface

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rust学习教程14 - 函数相关的知识,希望对你有一定的参考价值。

本文节选自<<Rust语言圣经>>一书
欢迎大家加入Rust编程学院,一起学习交流:
QQ群:1009730433

函数

Rust的函数我们在之前已经见过不少,跟其他语言几乎没有什么区别。因此本章的学习之路将轻松和愉快,骚年们,请珍惜这种愉快,下一章你将体验到不一样的Rust。

在函数界,有一个函数只闻其名不闻其声,可以止小孩啼,在程序界只有hello,world!可以与之媲美,它就是add函数:

fn add(i: i32, j: i32) -> i32 
   i + j
 

该函数如此简单,但是又是如此的五脏俱全,声明函数的关键字fn,函数名add(),参数ij,参数类型和返回值类型都是i32,总之一切那么的普通,但是又那么的自信,直到你看到了下面这张图:

当你看懂了这张图,其实就等于差不多完成了函数章节的学习。但是这么短的章节显然对不起读者老爷们的厚爱,所以我们来展开下。

函数有以下需要注意的点:

  • 函数名和变量名使用蛇形命名法(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函数有两个参数,其中xi32类型,yf32类型,然后在该函数内部,打印出这两个值。这里去掉x或者y的任何一个的类型,都会报错:

fn main() 
    another_function(5, 6.1);


fn another_function(x: i32, y) 
    println!("The value of x is: ", x);
    println!("The value of y is: ", y);

错误如下:

error: expected one of `:`, `@`, or `|`, found `)`
 --> src/main.rs:5:30
  |
5 | fn another_function(x: i32, y) 
  |                              ^ expected one of `:`, `@`, or `|` // 期待以下符号之一 `:`, `@`, or `|` 
  |
  = note: anonymous parameters are removed in the 2018 edition (see RFC 1685) // 匿名参数在Rust 2018 edition中就已经移除
help: if this is a parameter name, give it a type // 如果y是一个参数名,请给予它一个类型
  |
5 | fn another_function(x: i32, y: TypeName) 
  |                             ~~~~~~~~~~~
help: if this is a type, explicitly ignore the parameter name // 如果y是一个类型,请使用_忽略参数名
  |
5 | fn another_function(x: i32, _: y) 
  |                             ~~~~

函数返回

在上一章节语句和表达式中,我们提到在Rust中,函数就是表达式,因此我们可以把函数的返回值直接赋给调用者。不像有些语言,会给返回值一个名称,在Rust中,只需要声明返回值的类型即可(在->之后,之前)。

函数的返回值就是函数体最后一条表达式的返回值,当然我们也可以使用return提前返回,下面的函数使用最后一条表达式来返回一个值:

fn plus_five(x:i32) -> i32 
    x + 5


fn main() 
    let x = plus_five(5);

    println!("The value of x is: ", x);

x + 5是一条表达式,求值后,返回一个值,因为它是函数的最后一行,因此该表达式的值也是函数的返回值。

再来看两个重点:

  1. let x = add_five(5),说明我们用一个函数的返回值来初始化x变量,因此侧面说明了在Rust中函数也是表达式, 这种写法等同于let x = 5 + 5;
  2. x + 5没有分号,因为它是一条表达式,这个在上一节中我们也有详细介绍

再来看一段代码,同时使用return和表达式作为返回值:

fn plus_or_substract(x:i32) -> i32 
    if x > 5 
        return x - 5
    

    x + 5


fn main() 
    let x = plus_or_substract(5);

    println!("The value of x is: ", x);

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

以上是关于Rust学习教程14 - 函数的主要内容,如果未能解决你的问题,请参考以下文章

Rust学习教程14 - 函数

Rust语言圣经14 - 函数

RUST 0x02 函数与注释与控制流

P5731 深基5.习6蛇形方阵

蛇形矩阵

蛇形填数