Rust 学习笔记:函数和控制流

sap外币重估流程图_SAP 外币评估方法(Valuation Method,评估方法) 在FI-GL模块评估外币时(T-code:F.05),需要输入ValuationMethod。下面分解一下评估方法是如何定义的。IMG -> FI -> General LedgerAccounting ->Business Transactions ->Closing ->Valuating -> ForeignCurrency Valuation ->... 阅读详情

Rust 学习笔记:函数和控制流

本篇文章介绍 Rust 的函数、注释和控制流。

函数(Function)

fn 关键字允许声明新函数。main 函数是程序的入口点。

在 Rust 中定义函数时,输入 fn,后跟函数名和一组圆括号。花括号告诉编译器函数体的开始和结束位置。

Rust 并不关心你在哪里定义你的函数,只关心它们被定义在调用者可以看到的作用域中。

示例:

fn main() {
    println!("Hello, world!");

    another_function();
}

fn another_function() {
    println!("Another function.");
}

运行结果:

在这里插入图片描述

我们可以将函数定义为具有形参的函数,形参是作为函数签名一部分的特殊变量。

示例:

fn main() {
    another_function(5);
}

fn another_function(x: i32) {
    println!("The value of x is: {x}");
}

运行结果:

在这里插入图片描述

在函数定义中,必须声明每个参数的类型。当定义多个参数时,用逗号分隔参数声明。

示例:

fn main() {
    print_labeled_measurement(5, 'h');
}

fn print_labeled_measurement(value: i32, unit_label: char) {
    println!("The measurement is: {value}{unit_label}");
}

运行结果:

在这里插入图片描述

语句和表达式

在 Rust 中,函数体由一系列语句组成,可以由表达式结尾。

  • 语句是执行某些操作的指令,但不返回值。
  • 表达式计算并返回一个结果值。

函数定义也是语句。

创建变量并使用 let 关键字为其赋值是语句。因为语句不返回值,所以不能将 let 语句赋值给另一个变量。

示例:

fn main() {
    let x = (let y = 6);
}

运行报错:

在这里插入图片描述

let y = 6语句不返回值,因此没有任何东西可以绑定 x。这与其他语言(如 C)中的情况不同,在这些语言中,赋值返回赋值的值。在这些语言中,你可以写 x = y = 6,让 x 和 y 的值都是 6,但在 Rust 中却不是这样。

表达式的计算结果是一个值,并且构成了在 Rust 中编写的大部分其余代码。考虑一个数学运算,比如 5 + 6,它是一个计算值为 11 的表达式。表达式可以是语句的一部分,例如语句 let y = 6 中的 6 是求值为 6 的表达式。调用函数是一个表达式。调用宏是一个表达式。用大括号创建的新作用域块是一个表达式。

示例:

fn main() {
    let y = {
        let x = 3;
        x + 1
    };

    println!("The value of y is: {y}");
}

表达式

{
    let x = 3;
    x + 1
}

是一个块,在这个例子中,它的值是 4。作为 let 语句的一部分,这个值被绑定到 y 上。注意,x + 1 行末尾没有分号,这与目前看到的大多数行不同。

表达式不包括结束分号。如果在表达式的末尾添加分号,则将其转换为语句,然后它将不返回值。

带返回值的函数

函数可以向调用它们的代码返回值。我们不为返回值命名,但必须在箭头(->)后面声明它们的类型。在 Rust 中,函数的返回值与函数体块中最终表达式的值是同义的。通过使用 return 关键字并指定一个值,可以提前从函数返回,但是大多数函数隐式地返回最后一个表达式。下面是一个返回值的函数示例:

示例:

fn five() -> i32 {
    5
}

fn main() {
    let x = five();

    println!("The value of x is: {x}");
}

在 five 函数中没有函数调用、宏,甚至没有 let 语句——只有数字 5 本身。这在 Rust 中是一个完全有效的函数。注意,函数的返回类型也被指定为 i32。

另一个示例:

fn main() {
    let x = plus_one(5);

    println!("The value of x is: {x}");
}

fn plus_one(x: i32) -> i32 {
    x + 1
}

运行这段代码将打印 x 的值为 6。但是,如果我们在包含 x + 1 的行末尾放置一个分号,将其从表达式更改为语句,程序将报错。

注释

在 Rust 中,惯用的注释样式以两个斜杠开始注释,并且注释一直持续到行尾。对于超出单行的注释,你需要在每一行都包含 //,像这样:

// So we’re doing something complicated here, long enough that we need
// multiple lines of comments to do it! Whew! Hopefully, this comment will
// explain what’s going on.

注释可以放在它所注释的代码上方的单独一行,也可以放在包含以下代码的行尾。

fn main() {
	// I’m feeling lucky today
    let lucky_number = 7; // I’m feeling lucky today
}

控制流

在大多数编程语言中,根据条件是否为真来运行某些代码以及在条件为真时重复运行某些代码的能力是基本的构建块。Rust 代码执行流的最常见结构是 if 表达式和循环。

if 表达式

if 表达式允许根据条件对代码进行分支。提供一个条件,然后声明:“如果满足此条件,则运行此代码块;如果条件不满足,就不要运行这段代码。”

示例:

fn main() {
    let number = 3;

    if number < 5 {
        println!("condition was true");
    } else {
        println!("condition was false");
    }
}

运行结果:

在这里插入图片描述

同样值得注意的是,这段代码中的条件必须是 bool 类型。如果条件不是 bool 类型,我们将得到一个错误。例如,尝试运行以下代码:

fn main() {
    let number = 3;

    if number {
        println!("number was three");
    }
}

报错:

在这里插入图片描述

这个错误表明 Rust 期望的是 bool 值,但得到的却是整数。Rust 不会自动尝试将非布尔类型转换为布尔类型,必须明确地提供一个布尔值作为它的条件。

使用 else if 处理多个条件

可以通过在 else if 表达式中组合 if 和 else 来使用多个条件。

示例:

fn main() {
    let number = 6;

    if number % 4 == 0 {
        println!("number is divisible by 4");
    } else if number % 3 == 0 {
        println!("number is divisible by 3");
    } else if number % 2 == 0 {
        println!("number is divisible by 2");
    } else {
        println!("number is not divisible by 4, 3, or 2");
    }
}

当这个程序执行时,它依次检查每个 if 表达式,并执行条件为 true 的第一个语句体。

在 let 语句中使用 if

因为 if 是一个表达式,我们可以在 let 语句的右侧使用它将结果赋值给一个变量。

正确的示例:

fn main() {
    let condition = true;
    let number = if condition { 5 } else { 6 };

    println!("The value of number is: {number}");
}

有可能成为 if 的每个分支的结果的值必须是相同的类型,如果类型不匹配,将会报错。

错误的示例:

fn main() {
    let condition = true;

    let number = if condition { 5 } else { "six" };

    println!("The value of number is: {number}");
}

报错信息:

在这里插入图片描述

if 块中的表达式求值为整数,else 块中的表达式求值为字符串。这行不通,因为变量必须有单一类型,Rust 需要在编译时明确地知道 number 变量是什么类型。

循环

Rust 有三种循环:loop、while 和 for。我们每个都试试。

loop

loop 关键字将无限循环,直到显式停止程序。

示例:

fn main() {
    loop {
        println!("again!");
    }
}

大多数终端都支持键盘快捷键 Ctrl+C 来中断陷入连续循环的程序。

幸运的是,Rust 还提供了一种使用代码跳出循环的方法。可以在循环中放置 break 关键字,以告诉程序何时停止执行循环。

continue 关键字则在循环中告诉程序跳过此循环迭代中的任何剩余代码,并进入下一个迭代。

从循环中返回值

可以在用于停止循环的 break 表达式之后添加想要返回的值,该值将从循环中返回。

示例:

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("The result is {result}");
}

运行结果:

在这里插入图片描述

在循环之前,声明一个名为 counter 的变量,并将其初始化为 0。然后声明一个名为 result 的变量来保存循环返回的值。在循环的每次迭代中,我们给计数器变量加 1,然后检查计数器是否等于 10。如果是,则使用 break 关键字和值 counter * 2。循环结束后,使用分号结束将值赋给 result 的语句。最后,在 result 中打印值,在本例中为 20。

也可以从循环内部返回。break 只退出当前循环,而 return 总是退出当前函数。

循环标签消除多个循环之间的歧义

如果循环中有循环,则在该点中断并继续应用于最内层的循环。可以选择在循环上指定一个循环标签,然后可以使用 break 或 continue 来指定这些关键字应用于有标签的循环,而不是最内层的循环。循环标签必须以单引号开始。下面是两个嵌套循环的例子:

fn main() {
    let mut count = 0;
    'counting_up: loop {
        println!("count = {count}");
        let mut remaining = 10;

        loop {
            println!("remaining = {remaining}");
            if remaining == 9 {
                break;
            }
            if count == 2 {
                break 'counting_up;
            }
            remaining -= 1;
        }

        count += 1;
    }
    println!("End count = {count}");
}

外部循环具有 ‘counting_up’ 标签,它将从 0 数到 2。没有标签的内部循环从 10 数到 9。第一个没有指定标签的 break 只会退出内循环。

程序打印:

count = 0
remaining = 10
remaining = 9
count = 1
remaining = 10
remaining = 9
count = 2
remaining = 10
End count = 2
带 while 的条件循环

示例:

fn main() {
    let mut number = 3;

    while number != 0 {
        println!("{number}!");

        number -= 1;
    }

    println!("LIFTOFF!!!");
}

这种结构消除了在使用 loop、if、else 和 break 时所必需的大量嵌套,并且更加清晰。当条件求值为 true 时,代码运行;否则,退出循环。

还可以使用 while 构造遍历集合(如数组)的元素。

示例:

fn main() {
    let a = [10, 20, 30, 40, 50];
    let mut index = 0;

    while index < 5 {
        println!("the value is: {}", a[index]);

        index += 1;
    }
}

这里,代码对数组中的元素进行计数。它从索引 0 开始,然后循环直到到达数组中的最终索引(也就是说,当 index < 5 不再为真时)。

然而,这种方法容易出错。如果索引值或测试条件不正确,我们可能会导致程序报错。例如,如果将 a 数组的定义更改为包含 4 个元素,但忘记将条件更新为 while index < 4,则代码将出现问题。它也很慢,因为编译器会添加运行时代码,在循环的每次迭代中执行索引是否在数组边界内的条件检查。

使用 for 循环遍历集合

作为一种更简洁的替代方法,可以使用 for 循环并为集合中的每个项执行一些代码。

示例:

fn main() {
    let a = [10, 20, 30, 40, 50];

    for element in a {
        println!("the value is: {element}");
    }
}

这样做提高了代码的安全性,并消除了可能由于超出数组的末尾或不够远而丢失某些项而导致的错误的可能性。

8,9,10,11,12,13代CPU特制win7 64位系统 对于7代以上的CPU装win7,在UEFI的模式下,如果不提前注入显卡驱动,就会一直卡在LOGO界面。对于此情况,我们推出一个内置了显卡和USB驱动的特制版win7系统。由于单文件已经大于了4G,所以推荐使用rufus来写入镜像安装。如还有问题,请记录下电脑配置,联系QQ11717907。制作完成以后,就可以通过U盘启动安装了。 阅读详情

相关推荐

SAP SD跨公司销售IDOC自动记账配置实战指南

本文详细介绍了SAP SD模块中跨公司销售IDOC自动记账的配置实战指南。通过IDOC技术实现集团企业间交易的自动化处理,显著提升财务效率和准确性。文章涵盖前置配置、RFC连接、合作伙伴参数设置及财务科目分配等关键步骤,并提供了常见错误排查和性能优化建议,帮助用户快速掌握这一高效业务流程。

weixin_29284885的博客 769

Rust 学习笔记

r

newCraftsman的博客 1181

CTF逆向-[GWCTF 2019]babyvm-WP-虚机模拟流程反向编码和z3约束求解器解方程工具的使用

CTF逆向-[GWCTF 2019]babyvm-WP-虚机模拟流程反向编码和z3约束求解器解方程工具的使用 来源:https://buuoj.cn/ 内容: 附件:https://pan.baidu.com/s/1FKkXN6JDI0QkGw-UE2crNA?pwd=grb0 提取码:grb0 答案:Y0u_hav3_r3v3rs3_1t! 总体思路 发现是虚机模拟 形成每个指令的逆向 找到加密值位置(有可能不止一个位置,该题就给了一个误导的) 找到命令执行的流程(也是不止一个) 逆向编写反向加密得到f

serfend's blog 976

Rust学习笔记

​这是我观看杨旭老师的Rust教程的笔记,笔记中省略了一些细节部分,如有不理解的请大家观看杨旭老师的视频。

qq_59294755的博客 2189

STM32F103 实例应用(10)——I2C读写24C32

一、应用简介 本文介绍24C32的读写,基于野火的软件I2C程序。 board_i2c.h /**=========================================================================== @file board_i2c.h @brief 本文件是用于I2C驱动 @author 青梅煮久 @version r0.1 @date 2021/01/13 -------------------------.

qq_34118600的博客 3447

领域驱动设计整理——实体和值对象设计

实体引言在领域驱动设计里,实体的设计可以说是通用语言的核心,也是最开始在模型划分中需要考虑的。怎么样设计实体和怎么样划分限界上下文同样重要。实体的概念就是要保证通用语言的完整性。领域驱动让设计实体的关注点从数据的属性和表的关联转化到了富有行为的领域概念上。 实体是具有可变性的,这是一个和值对象比较明显的区分,也即实体是可以持续得变化,持续得修改,并且具有唯一的标识。在设计实体的时候需要跳出CRUD的

马猴烧酒└(┐卍^o^)卍ドゥルルル~楪詩月「YUZURIHA SHIZUKI」 2万+

Rust 学习笔记(持续更新中…)

Rust 基础知识要点汇总,循序渐进,不讲废话,持续完善更新。

遇己 1363

Unity动画状态机实战:Trigger和Bool参数到底怎么选?附5个常见场景解析

本文深入解析Unity动画状态机中Trigger和Bool参数的核心差异与应用场景。通过对比两者在描述瞬时事件与持续状态上的本质区别,并结合角色移动、攻击连招、跳跃落地、受击死亡及环境交互等5个实战场景,提供了清晰的选择逻辑与避坑指南,帮助开发者构建更健壮、易维护的动画逻辑。

weixin_29009501的博客 120

Rust 学习笔记(基础篇)

rust 学习笔记

0xac001d09 3062

28-Halcon-- union_object_model_3d函数功能(用于3D模型融合)

Halcon算子union_object_model_3d是专业的3D模型融合工具,主要用于多视图拼接、部件组装和多源数据融合。该算子支持点云、网格和参数化模型输入,提供多种融合算法选择,包括基础点云拼接('points_cloud')、网格融合('mesh')和精确CAD布尔运算('cad')。工业应用涵盖逆向工程扫描拼接、汽车部件虚拟装配等场景,支持性能优化如空间分区和流式处理。算子还解决颜色属性融合、法向量保留等特殊需求,并提供拼接误差分析、拓扑验证等质量评估手段。最佳实践包含动态场景重建工作流和CA

weixin_45590420的博客 1055

C#里用HttpListener实现WEB API接口服务端

本文介绍了一个基于WinForm的HTTP服务实现方案。该方案使用HttpListener类创建了一个支持JSON POST请求处理的轻量级Web服务器,主要特点包括:1) 纯线程方式实现请求监听和处理;2) 提供标准化的JSON响应格式;3) 支持自定义请求处理逻辑;4) 包含完整的日志记录功能。代码示例展示了如何初始化服务、处理不同类型的请求(包括JSON POST),并提供了线程安全的UI更新机制。该实现适用于需要简单HTTP接口的Windows桌面应用程序,可作为程序间通信的基础设施。

大坡3D软件开发 228

Rust语言学习笔记

for (i, d) in s.char_indices() {//s.char_indices()返回迭代器(index, char)fn calculate_length(s: &String) -> usize { // s 是 String 的引用。//方式2 dbg!ChangeColor((i32, i32, i32),(i8,i8)),//包含两个元组。//通过函数返回一个结构体的实例,以及初始化简写(字段名和值名一样,可以简写,顺序无关)(30 * scale),//打印过程值,便于调试。

2401_84009065的博客 935

Python爬虫教程:抓取地方政府网站的公开文件与政策信息

Web爬虫是指一种自动化脚本,用于模拟人类浏览器访问网页、提取网页内容的数据抓取工具。发送请求到目标网页;获取网页内容;解析网页内容,提取所需数据;将数据保存或进一步处理。爬虫可以抓取各种形式的数据,如文本、图片、文件等。本教程将重点展示如何抓取地方政府网站上公开的政策文件、公告等信息。许多政府网站都会采取一定的反爬虫措施,防止大量数据被爬取。IP封锁:如果短时间内大量请求来自同一IP,可能会被封锁。验证码:一些网站会使用验证码来验证访问者是否为机器人。动态加载。

2201_76125261的博客 1981

Rust:函数与控制流

讲解Rust的函数、控制流

博客网站 https://async-area.com 1244

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Rust 控制流

if表达式:用于条件判断,可以用于赋值和多重条件处理。loop:用于创建无限循环,并可通过break语句返回值和退出循环。while循环:基于条件执行,适用于条件动态变化的情况。for循环:用于遍历集合,结合Range进行次数控制,代码更简洁安全。通过合理使用这些控制流结构,你可以编写出高效、清晰且安全的 Rust 代码。

HHX_01的博客 1732

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Rust学习四 rust的函数、注释与控制流

函数、注释与控制流 一 函数 rust以fn为关键字声明一个函数。函数命名规范为全小写,以下划线为分隔的单词。 fn main() { } 带参数的函数 多个参数以逗号分隔,函数参数必须指定数据类型 fn test(x: i32, y: u64)() { ... } 函数体内的语句与表达式 函数体由一系列的以表达式结尾的语句组成。到目前为止我们只涉及了没有表达式结尾的函数,但是能看出表达式是语句的一部分。因为rust是一种基于表达式的语言,这是一个需要理解的重大区别。其他语言在语句与表

littleRpl的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

函数和控制流

最后,再介绍一下函数的注释,Rust的注释分为单行注释(//)和多行注释(/* */)。这个语法和c++几乎一样。所以就没在主文中介绍了。对于本篇文章,主要是介绍了Rust中的一些简单的关键字以及用法,下一节进入“所有权”的学习。拜拜了你勒!!!

qq_59931372的博客 1413

Rust进阶:控制流、函数与复合类型详解

在学习了Rust的基础知识后,我们需要进一步掌握Rust的控制流、函数和复合类型等核心概念。控制流允许我们根据条件执行不同的代码或重复执行某些代码;函数帮助我们组织和重用代码;复合类型则让我们能够创建更复杂的数据结构。

欢迎来到智能安全前线!这里是AI与信息安全交汇之地。我们以代码为武器,深入大模型攻防实战,破解系统漏洞。追踪OpenAI、Meta前沿动态,用红蓝对抗思维,锻造智能时代的坚盾与利矛。 1044

【Rust编程:从新手到大师】 Rust 控制流深度详解

本文系统介绍了Rust语言的控制流机制,包括条件分支(if/if let)、循环结构(loop/while/for)和模式匹配(match)。Rust的控制流具有基于表达式、类型安全、穷尽性检查等核心特点,确保内存安全。文章详细讲解了if表达式作为返回值、三种循环的语法与表达式特性,以及match的模式匹配能力,通过代码示例展示了Rust控制流的最佳实践,适合不同阶段的Rust开发者学习参考。

【安歌er】的博客 1077

Rust语法:变量,函数,控制流,struct

Rust的struct定义如下:struct 名称{变量1: 类型,变量2: 类型…而struct的初始化则是使用名字+变量名:值的形式初始化,注意,struct不允许有字段为空值,也就是说需要全部值都初始化width: 10,length: 19而这些值的访问就类似于C的struct,直接用点+对应的字段即可。struct也可以设置为mut,而对于struct来说,一旦设置为mut,则里面每个值都必须要是mut,也就是说都是可变的。

qq_36102055的博客 1759

【Rust自学】3.5. 控制流:if else

一文带你搞懂Rust的if else结构

A Rookie in San Domenico School 1303

Rust的数据,函数及控制流内容总结

rust的基本数据类型,函数返回类型与函数形参类型,语句和表达式的定义,元组,控制流的内容,loop循环及特殊的遍历数组的方式

ylh的博客 699

【Rust】控制流

控制流是编程语言的基本构建块,Rust使用。条件必须是布尔类型,如果条件不是布尔类型,将会报错。表达式允许根据条件分支执行不同的代码块。表达式和循环来控制代码的执行流程。

qq_61867911的博客 965

Rust学习笔记_05——控制流(1)

循环是一种基础且强大的控制流结构,它允许你创建一个无限循环,直到你在循环体内显式地使用。它还可以选择性地返回一个值,这个值可以被赋值给循环外部的变量。它们允许你根据某个条件的真假来执行不同的代码块。Rust中的if表达式是有返回值的,这意味着你可以将if表达式的结果赋值给变量。循环本身不支持标签,但你可以通过其他方式如闭包或额外的变量来模拟这种行为)。不过,在嵌套循环中,你可以通过标签(labels)来区分不同层级的。循环,以处理更复杂的逻辑。是必需的,即使代码块中只有一条语句。语句(尽管Rust的。

LuckyLay的博客 1101

Rust match 控制流结构

match是Rust中最强大的控制流工具之一,它提供了一种优雅的方式来处理多种可能性。就像硬币分拣机一样,match能够精确地将值分配到正确的处理路径。

Humbunklung的专栏 861

Rust语言入门第七篇-控制流

Rust 的控制流是指程序执行过程中根据不同的条件选择不同的代码路径的能力。Rust 语言提供了一些关键的控制流构造,主要包括 if 表达式、match 表达式、loop、while、for 循环等。它的结构相对直接,但有几个特点需要注意,这些特点体现了 Rust 作为一门类型安全和表达式导向语言的特性。是 Rust 中的一种循环结构,它没有内置的终止条件,因此会一直执行循环体内的代码,直到遇到。语句,但是功能更加强大和灵活,可以匹配复杂的模式而不仅仅是整数或字符串值。来提供一个默认分支。

小电玩 1417
上一篇: Rust 学习笔记:基本语法和数据类型
下一篇: Rust 学习笔记:所有权
UestcXiye
博客等级 码龄8年 9029粉丝 1306原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值