当前位置: 首页 > news >正文

009 Rust函数

Rust函数定义形式

fn <函数名>([参数])[->返回值类型]{<函数体>
}

如下:

fn add(a:i32, b:i32)->i32{return a + b;
}

Rust 函数名称的命名风格小写字母以下划线分割,如get_soft_version()
函数参数函数返回值可以没有,如下:

fn hello() {println!("{}", add(1,2));
}

与 C/C++ 不同,Rust 中函数定义的顺序没有限制,可以函数调用在函数定义之前, Rust不在乎您在何处定义函数,只需在某个地方定义它们即可。如下:

fn main() {println!("Hello, world!");say_hello(); // 函数调用在定义之前
}// 函数定义
fn say_hello() {println!("Hello, CSDN!");
}

函数参数

Rust 中定义函数如果需要具备参数必须声明参数名称类型

fn add(a:i32, b:i32)->i32{return a + b;
}

函数体

Rust 函数体由一系列由表达式(Expression)结尾的语句(Statement)组成。
语句是执行某些操作且没有返回值的步骤。例如:

let a = 6;

这个步骤没有返回值,所以下面语句不正确:

let a = (let b = 2);

表达式有计算步骤且有返回值。如下:

// 这里假设已声明a、b、c变量
a = 7
b + 2
c * (a + b)

在 Rust 中,函数定义可以嵌套:

fn main() {fn one_two() -> i32 {12}println!("one_two() 的值为: {}", one_two());
}

函数返回值

上一个嵌套的例子中已使用 Rust 函数声明返回值类型的方式:在参数声明之后用 -> 来声明函数返回值的类型。
在函数体中,随时都可以用 return 关键字结束函数并返回一个类型合适的值。

fn add(a: i32, b: i32) -> i32 {return a + b;
}

Rust 不支持自动返回值类型推断,如果有返回值必须声明返回值类型。
Rust 函数的最后一个表达式将作为返回值,无return关键字、结尾没有分号,如下:

 fn add(a: i32, b: i32) -> i32 {a + b
}

注意:一定要是最后一个表达式的值,才能作为默认返回值。

函数返回多个值

在 Rust 中,函数可以返回多个值,主要通过以下几种方式实现:

  1. 返回元组:
fn calculate_stats(numbers: &[i32]) -> (i32, i32, f64) {let min = *numbers.iter().min().unwrap_or(&0);let max = *numbers.iter().max().unwrap_or(&0);let sum: i32 = numbers.iter().sum();let avg = sum as f64 / numbers.len() as f64;(min, max, avg)
}fn main() {let numbers = [1, 2, 3, 4, 5];let (min, max, avg) = calculate_stats(&numbers);println!("最小值: {}, 最大值: {}, 平均值: {:.2}", min, max, avg);
}
  1. 返回结构体(Struct)
    当返回的数据有明确含义时,使用结构体更清晰:
struct Stats {min: i32,max: i32,avg: f64,
}fn calculate_stats(numbers: &[i32]) -> Stats {let min = *numbers.iter().min().unwrap_or(&0);let max = *numbers.iter().max().unwrap_or(&0);let sum: i32 = numbers.iter().sum();let avg = sum as f64 / numbers.len() as f64;Stats { min, max, avg }
}fn main() {let numbers = [1, 2, 3, 4, 5];let stats = calculate_stats(&numbers);println!("最小值: {}, 最大值: {}, 平均值: {:.2}", stats.min, stats.max, stats.avg);
}

3. 返回数组或向量
当所有返回值类型相同时,可以使用数组或向量:

fn get_coordinates() -> [f64; 3] {[10.5, 20.3, 5.7]
}fn main() {let [x, y, z] = get_coordinates();println!("坐标: x={}, y={}, z={}", x, y, z);
}

4. 返回元组结构体

struct Point(f64, f64, f64);fn get_point() -> Point {Point(10.5, 20.3, 5.7)
}fn main() {let Point(x, y, z) = get_point();println!("点坐标: x={}, y={}, z={}", x, y, z);
}

5. 返回 Result或 Option
处理可能失败的操作时,可以返回多个结果:

fn divide(a: f64, b: f64) -> Result<f64, String> {if b == 0.0 {Err("除数不能为零".to_string())} else {Ok(a / b)}
}fn calculate(a: f64, b: f64) -> (Option<f64>, Option<f64>) {let sum = a + b;let product = a * b;(Some(sum), Some(product))
}fn main() {match divide(10.0, 2.0) {Ok(result) => println!("除法结果: {}", result),Err(e) => println!("错误: {}", e),}let (sum, product) = calculate(3.0, 4.0);println!("和: {:?}, 积: {:?}", sum, product);
}

6. 返回自定义枚举

enum OperationResult {Success(i32, i32),Failure(String),
}fn perform_operation(a: i32, b: i32) -> OperationResult {if b == 0 {OperationResult::Failure("除数不能为零".to_string())} else {let sum = a + b;let product = a * b;OperationResult::Success(sum, product)}
}fn main() {match perform_operation(10, 5) {OperationResult::Success(sum, product) => {println!("和: {}, 积: {}", sum, product)}OperationResult::Failure(msg) => {println!("操作失败: {}", msg)}}
}

7. 返回引用或可变引用- 避免复制大对象

fn get_min_max(numbers: &[i32]) -> (Option<&i32>, Option<&i32>) {let min = numbers.iter().min();let max = numbers.iter().max();(min, max)
}fn main() {let numbers = [5, 2, 8, 1, 9];let (min, max) = get_min_max(&numbers);println!("最小值: {:?}, 最大值: {:?}", min, max);
}
http://www.dtcms.com/a/394299.html

相关文章:

  • IT疑难杂症诊疗室
  • 视频播放器下载推荐,PotPlayer‌,KMPlayer,MPC-HC,GOM Player‌VLC media player,MPV,
  • Day04 分治 递归 | 50. Pow(x, n)、22. 括号生成
  • (博主大回归)洛谷题目:P1986 元旦晚会 题解 (本题简)
  • Windows Docker 环境下 VLLM 大模型存储最优解:Docker-Desktop 实例目录与多容器协同挂载方案
  • Elasticsearch面试精讲 Day 20:集群监控与性能评估
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘pydantic’ 问题
  • 设置永不待机 系统语言
  • PWA(渐进式Web应用)
  • gdb文档_第二章
  • 基础IO
  • Linux开发工具
  • DIDCTF-2023陇剑杯
  • 软件设计师软考备战:第四篇 计算机网络技术
  • 基于 GEE 利用 Sentinel-1 SAR 数据计算标准化双极化水体指数(SDWI)实现水体智能识别
  • 120-armv8_a_power_management:高级架构电源管理指南
  • 【MySQL初阶】02-库的操作
  • Kafka面试精讲 Day 20:集群监控与性能评估
  • 【C语言】数字模式求和算法的巧妙实现:深入解析循环与累加的艺术
  • 关系型数据库对比
  • 手机可视化方案(针对浓度识别)
  • LLM在应用计量经济学和因果推断中作用的思考
  • Redis 事务机制详解:从原理到实战
  • 【精品资料鉴赏】130页PPT汽车智能制造企业数字化转型SAP解决方案参考
  • 【区间贪心】P2859 [USACO06FEB] Stall Reservations S|普及+
  • Java进阶教程,全面剖析Java多线程编程,阻塞队列方式实现等待唤醒机制,笔记17
  • 【SAP小说】阿根廷项目的SAP突围:2025阿根廷平行账项目纪实
  • 具有广泛宿主范围的噬菌体在生态系统中很常见
  • 【Linux】进程概念(四):Linux进程优先级与进程调度的核心逻辑
  • @ModelAttribute 和@RequestBody有什么区别