一 、函数定义
(一)格式
使用fn关键字
fn是 function 的缩写
1.无返回值的
fn 函数名 ( [paraname: type]... ) {
函数体
}
参数必须声明参数名称和类型
函数定义时指定的参数叫做 形参。调用时传递给函数的参数叫做 实参。
例子
fn another_function() {
println!("Hello, runoob!");
}
2.有返回值的
(1)使用 return 关键字指定返回值
fn 函数名 ( [paraname: type]... ) -> 类型{
return value;
}
(2)不使用return语句,而使用结尾表达式作为返回值
结尾表达式不能由分号 ; 结尾
function function_name() -> return_type {
value
}
例子
fn main(){
println!("pi value is {}",get_pi());
println!("pi value is {}",get_pi2());
}
fn get_pi()->f64 {
22.0/7.0
}
fn get_pi2()->f64 {
return 22.0/7.0;
}
编译运行结果如下
pi value is 3.142857142857143
pi value is 3.142857142857143
二、函数使用
(一)语法格式
function_name(val1, val2, valN);
例子
fn main(){
fn_hello();
}
fn fn_hello(){
println!("hello from function fn_hello ");
}
(二)传递参数
有两种传递参数的方法,一种是把值直接传递给函数,另一种是把值的内存地址传递给函数。
1.值传递
就是把形参变量赋值为传递的值。因为是赋值,所以形参和实参各自保存了相同的值,互不影响。
范例
fn main(){
let no:i32 = 5;
mutate_no_to_zero(no);
println!("The value of no is:{}",no);
}
fn mutate_no_to_zero(mut param_no: i32) {
param_no = param_no*0;
println!("param_no value is :{}",param_no);
}
编译运行结果如下
param_no value is :0
The value of no is:5
2.引用传递
把当前变量的内存地址传递给函数。实参和形参都共同指向了同一个内存地址。
语法格式如下
fn function_name(parameter: &data_type) {
}
范例
fn main() {
let mut no:i32 = 5;
mutate_no_to_zero(&mut no);
println!("The value of no is:{}",no);
}
fn mutate_no_to_zero(param_no:&mut i32){
*param_no = 0; //解引用操作
}
编译运行结果如下
The value of no is 0.
(三)函数作为参数
在Rust中,函数可以作为参数传递给其他函数,也可以作为函数的返回值。
示例:
fn add(a: i32, b: i32) -> i32 {
a + b
}
fn subtract(a: i32, b: i32) -> i32 {
a - b
}
fn calculate(op: fn(i32, i32) -> i32, a: i32, b: i32) -> i32 {
op(a, b)
}
fn main() {
let result1 = calculate(add, 3, 5);
let result2 = calculate(subtract, 8, 4);
println!("Result 1: {}", result1);
println!("Result 2: {}", result2);
}