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的浅拷贝,同时使得左值失效,又有移动的内涵。

相关推荐
Patrick_Wilson2 分钟前
幂等到底是什么?从前端视角讲透 SQL、HTTP 与 POST 接口的幂等设计
前端·后端·架构
凌览3 分钟前
一人公司别再上 Jenkins,真不值
前端·后端
菜鸟谢7 分钟前
Rust 元组与数组内存管理笔记
后端
oil欧哟8 分钟前
Codex 最佳实践(超级长文):先搞懂 AI,再用好 AI
前端·人工智能·后端
AskHarries8 分钟前
把一个外部系统接成 MCP 工具
后端·程序员
释然小师弟24 分钟前
Android开发十年:反思与回顾
android·后端·嵌入式
雪隐27 分钟前
个人电脑玩AI-04让5060 Ti给你打工——本地FLUX.2 Klein 的 AI 图片生成
人工智能·后端
掘金者阿豪1 小时前
多台服务器日志怎么统一清理?Ansible、Cron与cpolar自动化方案
后端
浮游本尊1 小时前
Java学习第45天 - 消息队列入门、异步解耦与最终一致性(RabbitMQ / RocketMQ)
后端
fallen_fish1 小时前
多路径写入一致性:从一次 Debug 到系统性防御
后端