函数及其返回值
使用fn
声明并定义函数
fn
用于声明定义一个函数,声明定义一个函数的大致格式如下:
1 | // Rust函数名及变量名使用`snake case`规范风格 |
fn
可以在全局和任意代码块内使用:
1 | fn main() { |
需要注意的是,Rust中不允许声明重名的函数,即使参数不一样也不行。
刚刚提到了,可以在函数参数前加mut
获取修改权,回忆一下,讲解隐藏(shadowing
)的最后,我说明了无法修改不可变变量。接下来,我们尝试通过函数修改不可变变量:
1 | fn modify(mut n: i32) { |
cargo run
,输出:
1 | 12 |
很明显,虽然成功修改了n
,但是nt
却没有发生修改,原因涉及到超前知识,因此这里就简单解释一下:在向modify()
函数传参过程中,并没有将nt
移动到函数中,而是将其复制(copy
)到函数中作为n
的值,因此修改的是n
的值即nt
的拷贝,而不是nt
本身。
需要提醒的是,Rust传参时分两种情况:复制(copy
)和移动(move
)。关于
函数返回值
在Rust的函数中,有两种返回值的方式,一种是使用return
:
1 | fn func1(num: i32) -> i32 { |
另一种则是直接在函数代码块最后一行放置表达式:
1 | fn func2(num: i32) -> i32 { |
num != 0
时,func2()
将返回k / num
,整数除法结果不会保留小数部分,也不会四舍五入。
if
和loop
的返回值
在Rust中,if
、loop
、{}
也有返回值,下面给出了一些用法示例:
1 | fn main() { |
和函数不一样,if
、loop
、{}
不能使用return
返回值。
if
、loop
、{}
可以看作特殊的函数。因为返回值可以是表达式,所以可以这么写Rust代码:
1 | fn func(fg bool) -> i32 { |
但是{}
不可乱用,比如你不能这么写:
1 | fn func() -> i32 { |
因为{}
主要用于划分作用域,Rust编译器不允许这么写(也不建议这么写),如有需要,可以:
1 | fn func1() -> i32 { |