前言
好久没学新语言了,最近打算学学Rust并记录一下Rust的要点,方便后期给自己参考。
快速安装
Macos | Linux
curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh
Windows
安装包下载地址
Visual Studio Code 插件
搜索安装rust-analyzer
即可
快速创建rust项目
cargo new 项目名称
项目结构如下
项目根目录
- src
- main.rs
Cargo.toml
src
下是源代码,Cargo.toml
配置了项目的依赖,版本号等信息,cargo
是rust的包管理工具
运行rust代码
通过Cargo创建的项目可以直接在项目根目录下运行
cargo run
如果单独建立一个rust源码文件,则可以使用rustc编译,然后手动执行编译产物
rustc app.rs && ./app
变量
定义
let int_var = 222;
int_var = 100; // error!
直接使用let定义时,变量不可被更改,增加mut
才可以修改
let mut int_var = 222;
int_var = 100; // ok
作用域
变量只在当前作用域生效,作用域的定义类似于C,比如函数,控制语句的Body。当前作用域定义的同名变量可以覆盖父作用域的相应变量。
fn function() {
let int_var = 100; // 只在函数内部生效
if true {
let int_var = 20;
// 这里访问到的int_var则是20
}
}
常量
const THIS_IS_A_CONST: i64 = 10 * 200;
常量需要明确指定类型,由const
修饰,赋值表达式只能是编译时可计算出结果的。
方法
定义
fn function_name(param1: Type, param2: Type) -> ReturnType {
return xxx;
// or
xxx
}
由关键字fn
开头,参数列表由逗号隔开,参数名在前,类型追加在冒号后面,返回值类型在->
符号后拼接。返回值可以使用return返回,也可以不写return,但是注意分号也要去掉。
调用
分为两种调用方式,类似于其他语言的类方法和实例方法,具体会在介绍mod时详细展开
xxx::classFunc()
xxx.instancFunc()
数据类型
种类
- 整型:分为iXX和uXX系列,XX支持8,16,32,64,128,直接十六进制(0x),八进制(0o),二进制(0b),Byte(b'A')。默认i32
- 浮点型:f32和f64,默认f64
- 布尔值:bool,true或者false
- 字符:char,支持多字节字符,包括表情
- tuple:元组,例如
let tup: (i32, f64, u8) = (500, 6.4, 1);
- 数组:
let arr = [1, 2, 3, 4, 5];
虽然rust是强类型语言,但如果编译器能推导出来类型,我们定义变量时都可以忽略类型,这个和目前很多现代语言类似
let int_var = 222; // 这里不用写i32
let int_var = xxx::funcReturnInt32Var(); // 这里不用写i32
注释
单行
// hello, world
多行
文档上没有说这种注释方式,但是我试了一下的确可以
/*
Name:func
Param: arg1
*/
流程控制语句
if
// 常规的if else
if a < 5 {
} else if b == 6 {
} else {
}
// 对标三目操作符
let a = if b==0 {someval} else {otherval};
loop
loop {
// 永远运行
}
loop的break不仅退出循环,还可以返回一个值
let val = loop {
...
break some_val;
}
while
和其他语言的while
类似
while a < 5 {
...
break;
}
for
和其他语言的for
类似,对数组或者其他可迭代的对象进行元素遍历
for item in arr {
}