写点什么

Rust 从 0 到 1- 基础概念 - 函数

用户头像
关注
发布于: 2021 年 03 月 26 日
Rust从0到1-基础概念-函数

函数遍布在 Rust 代码中,可能会以为 Rust 是目前比较火的函数式编程语言,事实上 Rust 也确实支持函数式编程,但也支持面向对象编程、结构化编程等,汲取了多种编程范式特点。

在 Rust 中,声明函数的关键字是 fn,很简洁;而 main 函数一般作为程序的入口(和 C、Java 一样)。官方建议函数和变量的命名采用蛇形命名法(snake case),即全部小写,并使用下划线 _ 链接单词。参考下面的例子:

fn main() {    println!("Hello, world!");    say_hello();}
fn say_hello() { println!("Hello,main!");}
复制代码

函数定义的顺序对于 Rust 来说不重要,也可以在 main 函数之前定义 say_hello 函数。

参数

Rust 的函数可以具备 0 到 n 个参数,但是目前不支持参数默认值,也不支持 Java 那种可变数量参数,参考下面的例子:

fn main() {    println!("Hello, world!");    say_no("hello", 1);}
fn say_no(word:&str, number:i32) { println!("{} No {}", word, number);}
复制代码

函数体

Rust 函数体是由“语句”和“表达式”组成,他们都是可选的,也就是说即使函数体是空的,也不会报错。官方的说法是,Rust 是基于“表达式”的语言。那么“语句”和“表达式”的区别是什么?“语句”可以理解为是执行一些操作,但是并不返回值,譬如,声明变量;而“表达式”则会返回执行的结果,譬如,加法运算。参考下面的例子:

fn main() {    let x = 5;    let y = (let x=5);}
复制代码

上面的例子中 let x=5; 是“语句”,let y = ( let x=5 ); 则会报错,因为语句没有返回值,无法赋值给 y;但是反过来“表达式”可以是“语句”的一部分,譬如 let x=5;中的 5 就是一个表达式。按照官方的说法整个函数定义本身类似变量的声明也是“语句”,但是函数调用,宏的调用以及创建新的作用域的 {} 都是表达式。参考下面的例子:

fn main() {    let y = {        let x = 3;        x + 1    };    println!("The value of y is: {}", y);}
复制代码

注意上面例子中的 x+1 结尾是没有分号的,它是一个“表达式”,如果加上分号,就变成“语句”了,也就没有返回值了,在编译时会报错,大家可以试试。

具有返回值的函数

Rust 中函数的返回值等于函数体中最后一个表达式的值,我们通过在函数名字的后面追加 -> 声明返回值类型(必须)。当然也可以向其它语言一样通过 return 语句返回值。参考下面的例子:

fn five() -> i32 {  5}fn six() -> i32 {  if five() == 5 {    return 6;  }  0}fn plus(x:i32, y:i32) -> i32 {  x + y}fn main() {  println!("The value of five is: {}", five());  println!("The value of six is: {}",six());  println!("The value of plus is: {}",plus(five(),six()));}
复制代码

注意,如果我们在 plus 函数的 x + y 表达式后面加了分号变为 x + y; 那么编译的时候就会报错,因为变成了语句 plus 函数将没有返回值,与声明不符。


发布于: 2021 年 03 月 26 日阅读数: 8
用户头像

关注

还未添加个人签名 2021.03.23 加入

还未添加个人简介

评论

发布
暂无评论
Rust从0到1-基础概念-函数