rust函数

一 、函数定义

(一)格式

使用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

(二)语句和表达式

函数体由一系列的语句和一个可选的结尾表达式构成

Rust区分语句与表达式,其他语言并没有这样的区别。

语句(Statements)是执行一些操作但没有返回值的指令。

表达式(Expressions)计算并产生一个返回值。

语句与表达式的一个区别是语句以分号结尾,而表达式没有分号。

下列是语句

let y = 6;

函数定义是语句。

以下是表达式

7

b + 2

函数调用是一个表达式。

宏调用是一个表达式。

用大括号创建的一个块作用域也是一个表达式,例如:

复制代码
fn main() {
    let x = 5;
    let y = {
        let x = 3;
        x + 1
    };
    println!("x的值为 : {}", x);
    println!("y的值为 : {}", y);
}

其中

复制代码
{
     let x = 3;
     x + 1
}

就是一个表达式。

注意 x+1 这一行在结尾没有分号。表达式的结尾没有分号。如果在表达式的结尾加上分号,它就变成了语句。

二、函数使用

(一)

语法格式

复制代码
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);
}
相关推荐
To_OC2 小时前
手写 AI 编程 Agent 的命令执行工具:我被 child_process 坑出来的实战经验
后端·node.js·agent
科技道人3 小时前
记录 默认置灰/禁用 app ‘Search Engine Selector‘ 的disable按钮
开发语言·前端·javascript
花褪残红青杏小5 小时前
Rust图像处理第18节-分形画布缩放 + 拖拽交互:图像缩放 + f32 性能优化
rust·webassembly·图形学
逝水无殇5 小时前
C# 异常处理详解
开发语言·后端·c#
doiito5 小时前
【开源项目】用 Rust 重构中文 TTS!kokoroi-rs 高性能语音合成引擎介绍
ai·rust
玖玥拾6 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
铅笔侠_小龙虾7 小时前
Rust 学习目录
开发语言·学习·rust
考虑考虑7 小时前
Sentinel安装
java·后端·微服务
IT_陈寒7 小时前
SpringBoot自动配置失灵?你可能忘了这个关键注解
前端·人工智能·后端
云泽8087 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范