Rust个人学习笔记

感悟:感觉rust好像缝合怪,既有python的影子,又有java和cpp的影子,可能这就是新型编程语言趋势吧。而且他的各种规范很严格很规范,比java还更工程,各种规范不对都有warning。

命名规范:蛇形命名法,跟深度学习的python写法一样。

Rust 代码中的函数和变量名使用 snake case 规范风格。在 snake case 中,所有字母都是小写并使用下划线分隔单词。

cargo

基本上rust都是建一个项目,这样方便管理。

创建项目:

shell 复制代码
cargo new pro_name

编译:

shell 复制代码
cd pro_name
cargo build

直接run

shell 复制代码
cd pro_name
cargo run

删除项目

shell 复制代码
del pro_name -Force

变量不可变

rust中变量默认都是不可变得,如果要改变使用mut关键字来修饰变量。

rust 复制代码
let foo = 3; // 不可变
let mut foo2 = 3; // 可以改变

& 引用在默认情况也是不可变的

crate

翻译为集装箱,类型于cpp中得库,python中得包。

rust 复制代码
use std::io; // 导入io包
use std::rand::Rng; // 导入随机数包

隐藏(shadow)

rust 允许使用同名的新变量来隐藏旧变量的值。

rust 复制代码
let a = 3; // 可以
let a = a * 3; // 可以
let a = a + 3; // 可以

布尔表达式

在cpp中,数字可以隐式转换为布尔值;而rust中,数字不可以隐式转换为布尔值。

cpp:

cpp 复制代码
if(1) puts("YES");
else puts("NO");

rust:

rust 复制代码
if 1 == 1 { // if 1 { } 错误
    println!("YES");
} else {
    println!("NO");
}

matchexpect

expect

Rust 标准库中有很多叫做 Result 的类型:一个通用的 Result 以及在子模块中的特化版本,比如 io::Result

Result 类型是 枚举enumerations,通常也写作 enums 。枚举类型持有固定集合的值,这些值被称为枚举的 成员variants)。第六章将介绍枚举的更多细节。

Result 的成员是 OkErrOk 成员表示操作成功,内部包含成功时产生的值。Err 成员则意味着操作失败,并且包含失败的前因后果。

这些 Result 类型的作用是编码错误处理信息。Result 类型的值,像其他类型一样,拥有定义于其上的方法。io::Result 的实例拥有 expect 方法。如果 io::Result 实例的值是 Errexpect 会导致程序崩溃,并显示当做参数传递给 expect 的信息。如果 read_line 方法返回 Err,则可能是来源于底层操作系统错误的结果。如果 io::Result 实例的值是 Okexpect 会获取 Ok 中的值并原样返回。在本例中,这个值是用户输入到标准输入中的字节数。

match

进行匹配:

rust 复制代码
let guess: u32 = match guess.trim().parse() {
    Ok(num) => num,
    Err(_) => continue,
};

**语句和表达式 **

语句没有返回值

rust 复制代码
let x = 5; // 这是语句,没有返回值
let x = (let y = 5); // 错误,	`y = 5` 没有返回值

函数调用是一个表达式。宏调用是一个表达式。我们用来创建新作用域的大括号(代码块),{},也是一个表达式。

rust 复制代码
let x = 5;
let y = {
	let x = 3;
	x + 1
};
// x = 5, y = 4

这个表达式:

rust 复制代码
{
	let x = 3;
	x + 1
}

是一个代码块,它的值是 4。这个值作为 let 语句的一部分被绑定到 y 上。注意结尾没有分号的那一行 x+1,与你见过的大部分代码行不同。表达式的结尾没有分号。如果在表达式的结尾加上分号,它就变成了语句,而语句不会返回值。在接下来探索具有返回值的函数和表达式时要谨记这一点。

函数

Rust不关心函数定义在哪里,只要定义了就行(与cpp系不同)。

具有返回值得函数

函数可以向调用它的代码返回值。我们并不对返回值命名,但要在箭头(->)后声明它的类型。在 Rust 中,函数的返回值等同于函数体最后一个表达式的值。使用 return 关键字和指定值,可从函数中提前返回;但大部分函数隐式的返回最后的表达式。

rust 复制代码
fn main() {
    println!("{}",foo());
}
fn foo() -> i32 {
    let x = 3;
    x + 1 // 表达式作为返回值
}
rust 复制代码
fn main() {
    println!("{}",foo());
}
fn foo() -> i32 {
    let x = 3;
    return x + 1; // return 返回值
}

函数参数

函数也可以被定义为拥有 参数parameters ),参数是特殊变量,是函数签名的一部分。当函数拥有参数(形参)时,可以为这些参数提供具体的值(实参)。技术上讲,这些具体值被称为参数(arguments ),但是在日常交流中,人们倾向于不区分使用 parameterargument 来表示函数定义中的变量或调用函数时传入的具体值。

在函数签名中,必须 声明每个参数的类型。这是 Rust 设计中一个经过慎重考虑的决定:要求在函数定义中提供类型注解,意味着编译器不需要你在代码的其他地方注明类型来指出你的意图。

rust 复制代码
fn main() {
    println!("{}",foo(4));
}
fn foo(x:i32) -> i32 {
    let x = x * x;
    x + 1
}
相关推荐
盐焗西兰花5 小时前
鸿蒙学习实战之路:状态管理最佳实践
学习·华为·harmonyos
小毅&Nora7 小时前
【人工智能】【深度学习】 ⑦ 从零开始AI学习路径:从Python到大模型的实战指南
人工智能·深度学习·学习
Maxwell_li17 小时前
Pandas 描述分析和分组分析学习文档
学习·数据分析·numpy·pandas·matplotlib
雷工笔记7 小时前
MES学习笔记之SCADA采集的数据如何与MES中的任务关联起来?
笔记·学习
繁星星繁8 小时前
【C++】脚手架学习笔记 gflags与 gtest
c++·笔记·学习
2301_810746318 小时前
CKA冲刺40天笔记 - day20-day21 SSL/TLS详解
运维·笔记·网络协议·kubernetes·ssl
Source.Liu8 小时前
【LibreCAD】 RS_Units 类完整解析
c++·qt·rust
Lovely Ruby8 小时前
前端er Go-Frame 的学习笔记:实现 to-do 功能(三),用 docker 封装成镜像,并且同时启动前后端数据库服务
前端·学习·golang
YJlio9 小时前
SDelete 学习笔记(9.18):安全删除、空闲清理与介质回收实战
笔记·学习·安全
74411 小时前
数据结构(C语言版)线性表-单链表的拓展及应用
笔记·强化学习