Skip to content

Rust 入门笔记

Cargo

Cargo 是 Rust 官方提供的构建系统和包管理器

cargo new <proj-name> # 新建项目
cargo build # 编译当前项目
cargo run # 编译并运行
cargo check # 语法检查
cargo test # 单元测试
cargo update # 更新 toml 中依赖项
cargo clean # 清理临时文件和目录

# cargo 可以分别构建 examples 文件夹下的每一个文件
cargo run --example helloworld # 单独构建 examples 下的 helloworld.rs

输出字符串

println!("hello world"); // 换行
print!("hello world"); // 不换行

let a = 12;
print!("a is {}", a);
println!("a is {}, a again is {}", a, a);
println!("a is {0}, a again is {0}", a); // 传入数字把后续参数当成数组访问,下标从 0 开始
println!("{{}}"); // {{ 和 }} 转义 { 和 },其他同 C

变量

Rust 变量有类型,编译器会自动推导,不允许中途改变类型,不允许精度有损失的强制类型转换

let a = 123; // 不可变变量
let mut a = 123; // 可变变量

不可变变量和常量

不可变变量的值可以重新绑定,常量不允许

let a = 123;
let a = 456;
// 以上合法
const a: i32 = 123;
let a = 456; // 此处报错

数据类型

Rust 是静态类型语言,可以显式指定类型

i32 u32 f64 bool char

前两者对应 int32_tuint32_t

函数返回值

fn add(a: i32, b: i32) -> i32{
    a+b
}

-> 指定返回值类型,默认为空元组

控制流

if 表达式

if number < 5{
    print!("<5");
}else{
    print!(">= 5");
}

loop 循环

loop{
    print!("looping...\n");
    break;
}

无限循环,break 退出

while 循环

let mut num = 3;
while num != 0{
    println!("{}!", num);
    num -= 1;
}

for 循环

for number in 1..4{
    println!("{}!", number);
}

所有权

所有权(ownership),借用(borrowing),引用(reference)

let s1 = String::from("abcde");
let s2 = s1; // s1 的所有权被转移给 s2
// 从此以后 s1 的值就不能用了
let s1 = String::from("abcde");
let s2 = &s1;
// 这是借用 s1,相当于引用,s2 指向栈上的 s1,不获得所有权

结构体

struct User{
    username: String,
    age: u8,
};

let user1 = User{
    username: String::from("anonymous"),
    age: 18,
};

枚举

enum IpAddr{
    V4,
    V6,
};

let four = IpAddr::V4;

match 语句

fn main() {
    let number = 3;

    match number {
        1 => println!("是第一名!"),
        2 => println!("是第二名"),
        3 => println!("是第三名"),
        _ => println!("其他名次"), // _ 代表“通配符”,匹配所有剩余情况
    }
}

match 必须穷尽这个类型的所有可能,_ 代替剩余情况