Redian新闻
>
Rust 基础系列 #5: Rust 中的函数 | Linux 中国

Rust 基础系列 #5: Rust 中的函数 | Linux 中国

科技
 
导读:在这一章中,在实例的帮助下,学习如何使用函数并从中返回值。                           
本文字数:4294,阅读时长大约:6分钟

在这一章中,在实例的帮助下,学习如何使用函数并从中返回值。

就跟任何现代编程语言一样,Rust 也有函数。

你已经熟悉的函数是 main 函数。这个函数在程序启动时被调用。

但是其他函数呢?在本文中,你将学习如何在 Rust 程序中使用函数。

函数的基本语法

你可能已经在我们声明 main 函数时知道了这一点,不管怎么样,还是让我们看一下声明函数的语法。

  1. // 声明函数
  2. fn function_name() {
  3. <statement(s)>;
  4. }
  5. // 调用函数
  6. function_name();

来让我们看一个简单的函数,它将字符串 "Hi there!" 打印到标准输出。

  1. fn main() {
  2. greet();
  3. }
  4. fn greet() {
  5. println!("Hi there!");
  6. }

📋 与 C 不一样的是,不管你是否要在声明或定义之前调用函数都没有关系。只要这个函数在 某个地方 被声明了,Rust 就会处理它。

正如预期,它的输出如下:

  1. Hi there!

这挺简单的。让我们把它提升到下一个级别。让我们创建一个接受参数并返回值的函数。有没有参数和有没有返回值这两者之间无关。

使用函数接受参数

声明一个接受参数的函数的语法如下:

  1. // 声明函数
  2. fn function_name(variable_name: type) {
  3. <statement(s)>;
  4. }
  5. // 调用函数
  6. function_name(value);

你可以把函数参数想象成一个传递给函数的 元组🔗 linux.cn。它可以接受多种数据类型的参数,而且你可以接受任意多个参数。所以,你不必局限于接受相同类型的参数。

与某些语言不同的是,Rust 没有 默认参数在调用函数时填充所有参数是强制性的

示例:饥饿函数

来让我们看一个程序来更好地理解这个。

  1. fn main() {
  2. food(2, 4);
  3. }
  4. fn food(theplas: i32, rotis: i32) {
  5. println!(
  6. "我饿了... 我需要 {} 个葫芦巴叶饼和 {} 个罗提!",
  7. theplas, rotis
  8. );
  9. }

在第 5 行,我声明了一个名为 food 的函数。这个函数接受 2 个参数:theplas 和 rotis(印度食物的名字)。然后我打印了这些变量的内容。

对于 main 函数,我使用参数 2 和 4 调用 food 函数。这意味着 theplas 被赋值为 2rotis 被赋值为 4

来让我们看一下程序的输出:

  1. 我饿了... 我需要 2 个葫芦巴叶饼和 4 个罗提!

我现在真的饿了... 😋

从函数返回值

就像函数可以接受参数一样,函数也可以返回一个或多个值。这样的函数的语法如下:

  1. // 声明函数
  2. fn function_name() -> data_type {
  3. <statement(s)>;
  4. }
  5. // 调用函数
  6. let x = function_name();

函数可以使用 return 关键字或者使用表达式而不是语句来返回一个值。

等等!什么是表达式?

在进一步之前:语句与表达式

在讲解 Rust 函数的例子中提起这个可能不太合适,但是你应该理解 Rust 和其他编程语言中语句和表达式的区别。

语句是以分号结尾且 不会计算出某个值 的代码行。另一方面,表达式是一行不以分号结尾且计算出某个值的代码行。

来让我们用一个例子来理解:

  1. fn main() {
  2. let a = 873;
  3. let b = {
  4. // 语句
  5. println!("Assigning some value to b...");
  6. // 表达式
  7. a * 10
  8. };
  9. println!("b: {b}");
  10. }

在第 3 行,我开始了一个代码块,在这个代码块中我有一个语句和一个表达式。注释标明了哪个是哪个。

在第 5 行的代码不会计算出某个值,因此需要以分号结尾。这是一个语句。

第 8 行的代码计算出了一个值。它是 a * 10873 * 10),并计算出了 8730。因为这一行没有以分号结尾,所以这是一个表达式。

📋 使用表达式是从代码块中返回某些东西的一种方便的方法。因此,当返回一个值时,它是 return 关键字的替代方案。表达式不仅仅用于从函数中 “返回” 一个值。正如你刚刚看到的,a * 10 的值是从内部作用域 “返回” 到外部作用域,并赋值给变量 b。一个简单的作用域不是一个函数,但表达式的值仍然被 “返回” 了。

示例:购买腐烂的水果

来让我们看一个演示以理解函数如何返回一个值:

  1. fn main() {
  2. println!(
  3. "如果我从水果摊买了 2 公斤苹果,我必须付给他们 {} 印度卢比。",
  4. retail_price(2.0)
  5. );
  6. println!(
  7. "但是,如果我从水果摊买了 30 公斤苹果,我就要付给他们 {} 印度卢比。",
  8. wholesale_price(30.0)
  9. );
  10. }
  11. fn retail_price(weight: f64) -> f64 {
  12. return weight * 500.0;
  13. }
  14. fn wholesale_price(weight: f64) -> f64 {
  15. weight * 400.0
  16. }

我在上述代码中有两个函数:retail_price 和 wholesale_price。两个函数都接受一个参数并将值存储在 weight 变量中。这个变量的类型是 f64,函数签名表示最终函数返回一个 f64 值。

这两个函数都将购买的苹果的重量乘以一个数字。这个数字表示苹果的当前每公斤价格。由于批发商有大量订单,物流在某种程度上更容易,价格可以降低一点。

除了每公斤价格之外,这两个函数还有一个区别。那就是,retail_price 函数使用 return 关键字返回乘积。而 wholesale_price 函数使用表达式返回乘积。

  1. 如果我从水果摊买了 2 公斤苹果,我必须付给他们 1000 印度卢比。
  2. 但是,如果我从水果摊买了 30 公斤苹果,我就要付给他们 12000 印度卢比。

输出显示,从函数返回值的两种方法都按预期工作。

返回多个值

你可以有一个返回不同类型的多个值的函数。你有很多选择,但返回一个元组是最简单的。

接下来是一个示例:

  1. fn main() {
  2. let (maths, english, science, sanskrit) = tuple_func();
  3. println!("数学考试得分: {maths}");
  4. println!("英语考试得分: {english}");
  5. println!("科学考试得分: {science}");
  6. println!("梵语考试得分: {sanskrit}");
  7. }
  8. fn tuple_func() -> (f64, f64, f64, f64) {
  9. // return marks for a student
  10. let maths = 84.50;
  11. let english = 85.00;
  12. let science = 75.00;
  13. let sanskrit = 67.25;
  14. (maths, english, science, sanskrit)
  15. }

函数 tuple_func 返回 4 个封装在一个元组中的 f64 值。这些值是一个学生在四门科目(满分 100 分)中获得的分数。

当函数被调用时,这个元组被返回。我可以使用 tuple_name.0 方案打印这些值,但我认为最好先解构元组,这样可以帮助我们搞清楚值对应的是什么。然后我使用了包含被解构的元组的值的变量来打印分数。

这是我得到的输出:

  1. 数学考试得分: 84.5
  2. 英语考试得分: 85
  3. 科学考试得分: 75
  4. 梵语考试得分: 67.25

总结

本文介绍了 Rust 编程语言中的函数。这些是函数的 “类型”:

◈ 不接受任何参数也不返回任何值的函数
◈ 接收一个或多个参数的函数
◈ 给调用者返回一个或多个值的函数

你知道接下来是什么吗?Rust 中的条件语句,也就是 if-else。请继续关注并享受学习 Rust 的过程。

(题图:MJ/5a07503b-c691-4276-83b2-bb42f5fda347)


via: https://itsfoss.com/rust-functions/

作者:Pratham Patel 选题:lkxed 译者:Cubik65536 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

LCTT 译者 :Qian Qian \"Cubik\"
🌟🌟🌟
翻译: 18.0 篇
|
贡献: 232 天
2022-10-04
2023-05-24
https://linux.cn/lctt/Cubik65536
欢迎遵照 CC-BY-SA 协议规定转载,
如需转载,请在文章下留言 “转载:公众号名称”,
我们将为您添加白名单,授权“转载文章时可以修改”。


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
使用 ChatGPT AI 从英文文本生成 Linux 命令 | Linux 中国归来(五)我参加过的public hearing (4) - 现场发言两千年秦兵马俑TUXEDO Stellaris 16(Gen5)是目前所能找到的终极 Linux 笔记本电脑 | Linux 中国如何在 Rocky Linux 9 / AlmaLinux 9 上安装 KVM | Linux 中国如何在 Linux 主机和 KVM 中的 Windows 客户机之间共享文件夹 | Linux 中国Agustín Hernández:中美洲建筑背景下的未来主义巨构Rust 基础系列 #2: 在 Rust 程序中使用变量和常量 | Linux 中国Rust 基础系列 #3: Rust 中的数据类型 | Linux 中国GDB 调试器如何通过调用帧信息来确定函数调用关系 | Linux 中国Rust 基础系列 #1: 创建并运行你的首个 Rust 程序 | Linux 中国blendOS 的目标:取代所有的 Linux 发行版 | Linux 中国R 语言 stats 包中的函数 | Linux 中国在 Linux 上用 Kdenlive 编辑视频 | Linux 中国OpenAI重磅更新,又变强了!API有了恐怖的函数调用能力,能处理更长上下文,价格还又降了75%!大家最喜欢的 Linux 终端字体 | Linux 中国Bash 基础知识系列 #5:在 Bash 中使用数组 | Linux 中国如何在 Linux 中合并 PDF 文件 | Linux 中国Rust 基础系列 #8:编写里程碑 Rust 程序 | Linux 中国Arch Linux 的最佳 GUI 包管理器 | Linux 中国Linux 中的模糊文件搜索 | Linux 中国Large函数还可以这样玩?这个90%的人不知道的统计函数也太牛了!如何在 Linux 系统中使用 Ventoy 创建多重引导的 U 盘 | Linux 中国Bash 基础知识系列 #3:传递参数和接受用户输入 | Linux 中国终端基础:在 Linux 中删除文件和文件夹 | Linux 中国90%的人不知道!这个自动生成随机数的函数太好用了!Excel中唯一无法被替代的函数,90%的人都不知道!7 个超轻量级 Linux 发行版 | Linux 中国Rust 基础系列 #6: 条件语句 | Linux 中国红楼梦迷是谁2023回国——总统套房,上海城隍庙小吃(多图)Bash 基础知识系列 #1:创建并运行你的第一个 Bash Shell 脚本 | Linux 中国Rust 基础系列 #7: 在 Rust 中使用循环 | Linux 中国Rust 基础系列 #4: Rust 中的数组和元组 | Linux 中国
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。