rust有准星_Rust 流程控制

条件选择

if 条件选择是一个表达式(可以用来赋值),并且所有分支都必须返回相同的类型。

判断条件不必用小括号括起来,条件后跟的代码块必须用大括号括起来。

示例一:if 表达式

fn main() {

let number = 3;

if number != 0 {

println!("number was something other than zero");

}

}

复制代码

示例二:if-else 表达式

fn main() {

let number = 3;

if number < 5 {

println!("condition was true");

} else {

println!("condition was false");

}

}

复制代码

示例三:if-else-if 表达式

fn main() {

let n = 5;

if n < 0 {

println!("{} is negative", n);

} else if n > 0 {

println!("{} is positive", n);

} else {

println!("{} is zero", n);

}

}

复制代码

循环语句

Rust 提供了三种循环:loop、while 和 for。

loop 循环

无限循环,一般配合break表达式使用。

示例:

fn main() {

// 这是一个无限循环

loop {

println!("again!");

}

let mut counter = 0;

let result = loop {

counter += 1;

// 设置循环终止条件,并返回一个结果

if counter == 10 {

break counter * 2;

}

};

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

}

复制代码

while 循环

示例:

fn main() {

let mut number = 3;

while number != 0 {

println!("{}!", number);、

number = number - 1;

}

println!("LIFTOFF!!!");

}

复制代码

for 循环

示例:

fn main() {

// `n` 的值为: 1, 2, ..., 100(`1..101` 等价于 `1..=100`)

for n in 1..101 {

if n % 15 == 0 {

println!("fizzbuzz");

} else if n % 3 == 0 {

println!("fizz");

} else if n % 5 == 0 {

println!("buzz");

} else {

println!("{}", n);

}

}

let a = [10, 20, 30, 40, 50];

// 使用 for 循环遍历集合中的元素

for element in a.iter() {

println!("the value is: {}", element);

}

}

复制代码

模式匹配

Rust 通过 match 关键字提供了模式匹配功能,类似于 C 中的 switch,但功能更强大。

match 表达式由 match 关键字、用于匹配的值和一个或多个分支构成,每个分支包含一个模式(pattern)以及一个待执行的表达式。

match VALUE {

PATTERN1 => EXPRESSION1,

PATTERN2 => EXPRESSION2,

PATTERN3 => EXPRESSION3,

...

PATTERNn => EXPRESSIONn,

}

复制代码

执行过程:依次将 PATTERN1,PATTERN2... 和 VALUE 进行比对,一旦匹配成功就执行该分支中 => 后面的表达式,并且不再继续匹配后面的分支。其中,PATTERNn 可以是字面量、元组、枚举、结构体、通配符、函数等。

模式匹配的要求:

所有分支必须穷举所有的可能。

每个分支必须是一个表达式,且通常这些表达式的返回值类型必须相同。

示例:

enum Direction {

East,

West,

North,

South,

}

fn main() {

let d_west = Direction::West;

let d_str = match d_west {

Direction::East => "East",

Direction::North | Direction::South => {

panic!("South or North");

}, // 该分支一定会触发 panic,返回值类型可以与其他分支不同

_ => "West",

};

println!("{}", d_str);

}

复制代码

解构

当待匹配的模式是复合类型时,可以提取复合类型值中的部分数据。

示例一:解构元组

fn main() {

let triple = (0, -2, 3);

println!("Tell me about {:?}", triple);

match triple {

// 解构元组中第2和第3个元素

(0, y, z) => println!("First is `0`, `y` is {:?}, and `z` is {:?}", y, z),

// 使用 `..` 忽略其他元素,仅匹配第1个元素

(1, ..) => println!("First is `1` and the rest doesn't matter"),

// `_` 匹配所有值,通常将它放在最后,用来匹配剩余的所有可能值

_ => println!("It doesn't matter what they are"),

}

}

复制代码

示例二:解构枚举

#[allow(dead_code)]

enum Color {

Red,

Blue,

Green,

RGB(u32, u32, u32),

HSV(u32, u32, u32),

HSL(u32, u32, u32),

CMY(u32, u32, u32),

CMYK(u32, u32, u32, u32),

}

fn main() {

let color = Color::RGB(122, 17, 40);

println!("What color is it?");

match color {

Color::Red => println!("The color is Red!"),

Color::Blue => println!("The color is Blue!"),

Color::Green => println!("The color is Green!"),

Color::RGB(r, g, b) =>

println!("Red: {}, green: {}, and blue: {}!", r, g, b),

Color::HSV(h, s, v) =>

println!("Hue: {}, saturation: {}, value: {}!", h, s, v),

Color::HSL(h, s, l) =>

println!("Hue: {}, saturation: {}, lightness: {}!", h, s, l),

Color::CMY(c, m, y) =>

println!("Cyan: {}, magenta: {}, yellow: {}!", c, m, y),

Color::CMYK(c, m, y, k) =>

println!("Cyan: {}, magenta: {}, yellow: {}, key (black): {}!", c, m, y, k),

}

}

复制代码

示例三:解构结构体

fn main() {

struct Foo {

x: (u32, u32),

y: u32,

}

let foo = Foo { x: (1, 2), y: 3 };

match foo {

Foo { x: (1, b), y } => println!("First of x is 1, b = {}, y = {} ", b, y),

// 可以对字段(field)重命名

Foo { y: 2, x: i } => println!("y is 2, i = {:?}", i),

// Foo { y: 2, x } => println!("y is 2, i = {:?}", x),

// 可以使用 `..` 忽略一些字段(field)

Foo { y, .. } => println!("y = {}, we don't care about x", y),

}

}

复制代码

示例四:匹配范围

fn main() {

let x = 1;

match x {

1 ..=10 => println!("一到十"),

_ => println!("其它"),

}

let c = 'w';

match c {

'a' ..='z' => println!("小写字母"),

'A' ..='Z' => println!("大写字母"),

_ => println!("其他字符"),

}

}

复制代码

示例五:多重匹配

fn main() {

let x = 1;

// 匹配多个模式时,使用 `|` 分隔

match x {

1 | 2 => println!("一或二"),

_ => println!("其他"),

}

}

复制代码

后置条件

一个 if 表达式可以被放在 match 的模式之后,被称为 match guard。

示例:

fn main() {

let x = 4;

let y = false;

match x {

4 | 5 if y => println!("yes"),

_ => println!("no"),

}

}

复制代码

绑定

可以使用 @ 符号将模式中匹配的值绑定一个名称,详细说明见Identifier patterns。

示例:

fn age() -> u32 {

15

}

fn main() {

println!("Tell me what type of person you are");

match age() {

0 => println!("I haven't celebrated my first birthday yet"),

n @ 1 ..= 12 => println!("I'm a child of age {:?}", n),

n @ 13 ..= 19 => println!("I'm a teen of age {:?}", n),

// Nothing bound. Return the result.

n => println!("I'm an old person of age {:?}", n),

}

}

复制代码

if let

在某些情况下,可以使用 if let 对模式匹配进行简化。

示例:

fn main() {

let number = Some(7);

let letter: Option = None;

match number {

Some(i) => {

println!("Matched {:?}!", i);

}

_ => {} // 此分支什么都不做,但是不能省略,因为模式匹配要列举所有可能

};

// 可以将上面的模式匹配该为下面这种形式

if let Some(i) = number {

println!("Matched {:?}!", i);

}

// 如果需要对未匹配的情况进行处理,还可以添加 `else` 分支

if let Some(i) = letter {

println!("Matched {:?}!", i);

} else {

println!("Didn't match a number. Let's go with a letter!");

}

}

复制代码

while let

与 if let 类似,使用 while let 也可以对模式匹配进行简化,只关注要匹配的值,其它的值不用做显式处理。

示例:

fn main() {

let mut optional = Some(0);

loop {

match optional {

Some(i) => {

if i > 9 {

println!("Greater than 9, quit!");

optional = None;

} else {

println!("`i` is `{:?}`. Try again.", i);

optional = Some(i + 1);

}

}

_ => {

break;

}

}

}

// 上面loop中的模式匹配可以改为下面这种形式

while let Some(i) = optional {

if i > 9 {

println!("Greater than 9, quit!");

optional = None; // 这是循环结束条件

} else {

println!("`i` is `{:?}`. Try again.", i);

optional = Some(i + 1);

}

}

}

复制代码

相关资料

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值