当前位置: 首页 > 科技观察

Rust劝导系列之功能

时间:2023-03-14 09:04:45 科技观察

大家好,我是站长polarisxu。这是Rust退出系列的第9篇教程,探索Rust中的功能。Rust是一种支持函数式编程的语言。在Rust中,作为一等公民的函数本身就是类型。函数类型变量可以作为其他函数的参数或返回值,也可以赋值给其他变量,也可以直接调用执行。01Rust中定义函数,使用fn关键字定义函数(Go中使用func,本以为省略就够了,没想到Rust更省略了!)。与大多数其他语言的语法类似,Rust中的函数签名也包括函数名、函数参数类型和返回值类型。与Go语言中的函数相比,Rust的函数定义有些不同:除了上述关键字外,一般建议Rust函数名使用下划线风格(小写字母),即snake_case,否则编译器会警告;而Go使用驼峰式大小写;返回值类型使用->标识;虽然对于如何放置花括号没有严格的要求,但通常建议紧跟在函数签名之后而不是另起一行(Go是这样做的唯一方法);函数声明如下:fnfunctionname(parametername:type)->returntype{//functionbody(implementedfunction)}函数示例:fnmax(x:i32,y:i32)->i32{ifx>y{returnx;}returny;}02functionParameters注意和Go不同的是,虽然上面例子中x和y的类型相同,但是x的类型不能省略。与Go一样,Rust中的函数不能指定默认值。但是Go支持可变参数,Rust目前不支持。//Go中像这样的函数,Rust不支持funcSum(x,yint,z...int)int{//functionbody}函数参数和变量一样,默认不可变。当需要可变参数时,同样你要使用mut关键字。看一个例子:(来自《Rust 编程之道》)fnmodify(mutv:Vec)->Vec{v.push(4);v}fnmain(){letv=vec![1,2,3];letv=modify(v);println!("{:?}",v);}按值传参,函数需要修改传入的动态数组,所以在参数前加上mut关键字。因为mut用在函数参数前(这叫变量修饰),所以在main中的声明和调用中没有用到mut。再看另一种情况:fnmodify(v:&mutVec){v.push(4);}fnmain(){letmutv=vec![1,2,3];modify(&mutv);println!("{:?}",v);}这是通过引用传递参数。注意mut的位置:按值传递,参数是可变的,mut放在参数之前,和定义可变变量一样;但是通过引用传递,&mutVec是一个整体,是一个变量引用类型,所以参数前面的mut就不需要了。(mut的位置不一样,真的很容易晕!)另外,函数参数可以用_忽略。03函数返回值如果函数没有返回值,->不写。其实根据前面的介绍,没有返回值的函数的返回类型是unitvalue()。因此,该类型也可以显式返回。虽然Rust不支持多个返回值,但是因为元组类型,返回一个元组相当于支持多个返回值。fnmain(){let(x,y)=swap(2,3);println!("x={},y={}",x,y);}fnswap(x:i32,y:i32)->(i32,i32){(y,x)}不知道大家有没有注意到swap函数需要返回一个元组,但是我们没有使用return语句,但是要特别注意这里末尾没有分号。正如我之前所说,Rust中的一切都是表达式。if表达式、循环表达式等,其值为最后一个表达式的值。对于函数,它的返回值是最后一个表达式的值。因此,Rust中通常不使用returns来返回值。当然用return也是可以的,但是需要注意加分号。04特殊函数main不用多说,是Rust程序的入口函数。签名如下:fnmain()没有参数,也没有返回值。05总结关于函数还有很多其他的知识点,比如高阶函数、方法、闭包等,下一节将介绍高阶函数和闭包。本文转载自微信公众号「polarisxu」,可关注下方二维码。转载本文请联系polarisxu公众号。