Rust语言入门小结(第2篇)

主要是Rust语言圣经学习的小结,供参考

基本概念

rust 复制代码
// Rust 程序入口函数,跟其它语言一样,都是 main,该函数目前无返回值
fn main() {
    // 使用let来声明变量,进行绑定,a是不可变的
    // 此处没有指定a的类型,编译器会默认根据a的值为a推断类型:i32,有符号32位整数
    // 语句的末尾必须以分号结尾
    let a = 10;
    // 主动指定b的类型为i32
    let b: i32 = 20;
    // 这里有两点值得注意:
    // 1. 可以在数值中带上类型:30i32表示数值是30,类型是i32
    // 2. c是可变的,mut是mutable的缩写
    let mut c = 30i32;
    // 还能在数值和类型中间添加一个下划线,让可读性更好
    let d = 30_i32;
    // 跟其它语言一样,可以使用一个函数的返回值来作为另一个函数的参数
    let e = add(add(a, b), add(c, d));

    // println!是宏调用,看起来像是函数但是它返回的是宏定义的代码块
    // 该函数将指定的格式化字符串输出到标准输出中(控制台)
    // {}是占位符,在具体执行过程中,会把e的值代入进来
    println!("( a + b ) + ( c + d ) = {}", e);
}

// 定义一个函数,输入两个i32类型的32位有符号整数,返回它们的和
fn add(i: i32, j: i32) -> i32 {
    // 返回相加值,这里可以省略return
    i + j
}

变量可变性

  1. 其他大多数语言,要么只支持声明可变的变量,要么只支持声明不可变的变量;Rust两者都要,既要灵活,又要安全。
  2. 默认不可变,让代码安全,性能更好。
  3. 通过mut让变量变为可变。
  4. 常量与不可变变量,常量用const修饰。

变量绑定

  1. 例如let a = "hello world",变量绑定不同与其他语言的变量赋值,是与Rust的内存管理方法相关的。
  2. 绑定可有较复杂的形式,如解构,let (a, mut b):(bool, bool)=(true,false);
  3. 变量遮蔽,一方面类似于C&C++或Python中的变量作用域;另一方面,不同类型的变量可以同名;

基本类型

  1. Rust一般能自动推导出变量类型,因此可省略类型,但能力有边界,如let guess = "42".parse().expect("Not a number!"); 需要明确指定,"42".parse::<i32> 或 let guess: i32 = ...
  2. 字符、布尔、单元类型。单元是(),这是main()、println!()等函数的返回值。

语句与表达式

Rust语言区分语句与表达式。表达式不能含分号;表达式一旦加上分号,就会变成语句,不会返回值。

rust 复制代码
fn add_with_extra(x: i32, y: i32) -> i32 {
    let x = x + 1; // 语句
    let y = y + 5; // 语句
    x + y // 表达式
}

函数

Rust是强类型语言,每个函数参数都要明确标出具体类型。

函数可使用表达式或return作为返回值。

特殊函数:返回()的函数,永不返回发散函数,

rust 复制代码
fn forever() -> ! {
  loop {
    //...
  };
}

所有权

计算机语言内存管理的三种方式:自动回收、手动管理、所有权管理。

我粗略地理解,Rust语言将基本数据类型及其组合,放在栈上管理,不存在所有权转移,执行浅拷贝,这样的变量称为有Copy的特征,"一个旧的变量在被赋值给其他变量后仍然可用";而对于堆上的变量,则有所有权规则;对于堆上的变量,Rust语言的绑定右值类似于Python的浅拷贝,同时使得左值失效,又有移动的内涵。

相关推荐
实心儿儿1 分钟前
Qt — Qt 多线程
开发语言·qt
Apifox30 分钟前
Apifox 9 月更新|CLI 能力升级、GitLab 私有化部署接入与产品体验优化
前端·后端·测试
小小龙学IT33 分钟前
Go 泛型(Generics)深度解析:从类型参数到生产实践
开发语言·数据库·golang
鱼弦40 分钟前
Agent智能体 vs 传统运维:职业天花板的3倍差距?
后端
暗夜行者之光40 分钟前
LangGraph 实战:用 LangSmith 可视化追踪 AI 智能体执行轨迹
后端
hold?fish:palm42 分钟前
45 二叉树的右视图
开发语言·c++·算法
MI_farmer44 分钟前
Anaconda 安装在 D 盘但虚拟环境跑到 C 盘,以及 Conda PermissionError: WinError 5 的解决方法
c语言·开发语言·conda
鱼弦1 小时前
Agent 的工具选择策略:从硬编码到动态决策
后端
Lost of 程序猿1 小时前
建造者模式实战:告别“十参数构造函数“的数据导出任务
后端·设计模式·c#·asp.net
SensorFlow1 小时前
ClickHouse 埋点事件表:先验证时间与重复,再谈漏斗看板
后端