Rust个人学习笔记2

一定要牢记Rust是基于表达式的语言,除了声明语句和表达式语句外,其他的都是表达式。所以if也是表达式,它可以被用作右值。

条件控制

if-else。cpp和python得结合。

rust 复制代码
fn main() {
    let number = 34;
    if number < 0 {
        println!("number < 0");
    } else if number == 0 {
        println!("number = 0");
    } else {
        println!("number > 0");
    }
}
rust 复制代码
fn main() {
    let cond = true; // 语句和表达式
    let number = if cond {1} else {4};
    println!("{}",number);
}

循环控制

for

像python

python 复制代码
for i in range(1,100): # python的
	pass
rust 复制代码
// Rust
// [l, r)
for i in 1..10 { // l..r 默认为 [l, r)
	println!("{}",i);
}

// [l, r]
for i in 1..=10 { // 加一个等号表示 左闭 右闭
    println!("{}",i);
}

遍历数组:

rust 复制代码
fn main() {
    let a = [1,2,3,4,5];
    for i in a.iter() {
        println!("{}",i);
    }
}

// c风格
fn main() {
    let a = [1,2,3,4,5];
    let n = a.len();
    for i in 0..n {
        println!("{}",a[i]);
    }
}

fn main() {
    let a = [1,2,4];
    // 切片
    for i in a[..].iter() {
        pass
    }
   	// 遍历字符串
    let str = "str";
    for ch i str.chars() {
        pass
    }
    // 遍历动态数组vector
    let c = vec![1,2,4];
    for i in c.iter() {
        pass
    }
}

需要注意的是,使用迭代器遍历,得到的不是值本身,而是对值的引用,类似cpp中的:

cpp 复制代码
vector<int> a;
for(auto it = a.begin(); it != a.end(); ++it) {
	pass;
}

需要加上&it

rust 复制代码
fn main() {
    let a = [1,2,4];
    // 切片
    for i in a[..].iter() {
    	if *i == 3 {
    		pass
    	}
        pass
    }
   	// 遍历字符串
    let str = "str";
    for ch i str.chars() {
        pass
    }
    // 遍历动态数组vector
    let c = vec![1,2,4];
    for i in c.iter() {
    	if *i == 3 {
    		pass
    	}
        pass
    }
}
rust 复制代码
fn main() {
    let a = [1,2,3,4,5];
    for i in a[..].iter() {
        if *i == 1 {
            print!("YES");
        }
    }
}
rust 复制代码
fn main() {
    let str = "abcdefg";
    // 字符串不用 *,chars不是迭代器类型
    for ch in str.chars() {
        println!("{}",ch);
        if ch == 'a' {
            println!("YES");
        }
    }
}

python中的enumerate。

rust 复制代码
fn main() {
    let str = "abcdefg";
    for (i,ch) in str.chars().enumerate() {
        println!("{} {}",i,ch);
        if ch == 'a' {
            println!("YES");
        }
    }
}

while

while与python的类似。

python 复制代码
# python
n = 3
while n > 0:
	print(n)
	n -= 1

Rust中的

rust 复制代码
let mut number = 3;
while number > 0 {
	println!("{}",number);
	number -= 1; // 与python一样,没有 -- ++这些操作符
}

loop

loop相当于while true {},它没有结束的条件,只要没有break就一直循环下去。

rust 复制代码
fn main() {
    let mut number:i32 = 3;
    loop {
        println!("{}",number);
        number -= 1;
        if number == 0 {
            break;
        }
    }
}

breakcontinue

与其他编程语言一样的作用。

作为右值

还是那句话,Rust是基于表达式的语言,这赋予了Rust很多新的特性。像前面提到的if是表达式一样,loop和break都是表达式,同样可以作为右值:

rust 复制代码
fn main() {
    let mut number:i32 = 3;
    let a = loop {
        println!("{}",number);
        number -= 1;
        if number == 0 {
            break 3;
        }
    };
    println!("{}", a);
}

模式匹配

C/C++中有switch,可以控制多个流程分支。Rust把switch进行了升级,提供了match关键字,这是一个非常强大的控制流运算符,被称为模式匹配。

这种用法与C/C++中switch的用法类似,只是每个分支不需要加break。

在Rust中,match后面跟一个表达式,然后是分支。每个分支又分成两个部分,=>前面的部分叫模式,=>后面是执行体。

match执行时,先计算表达式的值,然后用该值与模式逐一进行匹配,当匹配成功时,执行该模式对应的执行体。若多个模式都匹配,也只执行第一个匹配成功的执行体。模式必须能覆盖所有的可能性,可以使用"_",匹配其他的情况,类似于C/C++的default。

e.g.假设有1到5元的硬币,找到每个硬币类型出现了几次。

rust 复制代码
fn main() {
    let a = [1, 5, 2, 1, 2, 5, 3, 2, 2, 2, 4, 4];
    let (mut num1, mut num2, mut num3, mut num4, mut num5) = (0,0,0,0,0);
    for v in a[..].iter() {
        let val = *v;
        match val {
            1 => num1 += 1,
            2 => num2 += 1,
            3 => num3 += 1,
            4 => num4 += 1,
            5 => num5 += 1,
            _ => break
        }
    }
    println!("一元硬币有{}, 两元有{} 三元有{} 四元有{} 五元有{}",num1, num2, num3, num4, num5);
}
相关推荐
paopaokaka_luck2 小时前
基于springboot3+vue3的企业考勤管理系统(部门树递归、Echarts图形化分析)
开发语言·spring boot·学习·echarts·mybatis·需求分析·代码规范
minglie12 小时前
zynq高频小数据量PS闭环 抖动时间的测量
学习
V哥AI增长2 小时前
小红书笔记在生成式AI引擎中的可见性机制解析:从抓取原理到GEO工程化实践
大数据·人工智能·笔记
long3162 小时前
MySQL 学习练习(配套 01 入门资料)
数据库·学习·mysql
梦雨生生3 小时前
java开发工具(学习第一天)
java·开发语言·学习
lanfordxb4 小时前
从 Markdown 到图片卡片:MarkCard Studio 的功能设计与官网实现记录
rust·软件工程·ai工具
yiqiefeimeng5 小时前
Rust还是Go?编程语言的未来之争
rust·go·编程语言·技术社区·未来之争
Hotchip_MEMS6 小时前
当雾化器遇上MEMS:一场从交互到制造的全链路效率提升
人工智能·笔记·物联网·电脑·制造
是上好佳佳佳呀7 小时前
【深度学习|Day02】PyTorch 深度学习笔记(下):张量运算与自动微分
pytorch·笔记·深度学习
IT古董8 小时前
【MES学习笔记系列】05 - MES 数据库设计
笔记·学习·mes