Rust 初体验3

"开胃"代码

rust 复制代码
fn main() {
    let (a, mut b): (bool,bool) = (true, false);
    // a = true,不可变; b = false,可变
    println!("a = {:?}, b = {:?}", a, b);

    b = true;
    assert_eq!(a, b);
}

Rust语法和C语言有很大不同,特别是在变量声明、打印输出和错误处理等方面。

  1. fn main() {...}:这是Rust程序的主函数,类似于C语言中的int main() {...}。 但是 fn 不是数据类型,而是函数类型。

  2. let (a, mut b): (bool,bool) = (true, false);:这里定义了两个布尔变量a和b,其中a是不可变的(immutable),而b是可变的(mutable)。这与C语言中的定义方式不同,C语言通常使用const关键字来定义常量,而变量则不需要特殊声明。

  3. println!("a = {:?}, b = {:?}", a, b);:这是一个宏调用,用于打印变量a和b的值。在C语言中,通常使用printf函数来实现类似的功能。

  4. b = true;:这行代码将变量b的值改为true。在C语言中,可以直接使用赋值运算符=来改变变量的值。

  5. assert_eq!(a, b);:这是一个断言宏,用于检查两个表达式是否相等。如果不相等,程序会在这里停止执行并报告错误。在C语言中,通常需要自己编写比较和错误处理的代码。

const

Rust语言和C语言都支持常量(const)的概念,但它们在定义、使用和内存存储方面存在一些差异。

1.定义方式

  • C语言中的const变量需要在声明时指定类型和初始值,例如const int x = 10;

  • Rust语言中的const常量在定义时不需要显式指定类型,而是通过初始值自动推断类型,例如const X: i32 = 10;。

2.可变性

  • C语言中的const变量的值,在程序运行过程中不能被修改,但它们所指向的对象(如果是指针类型的const变量)是可以被修改的。

  • Rust语言中的const常量的值,在编译时就已经确定,并且在运行过程中不能被修改。Rust还提供了不可变变量(let)的概念,用于在运行时绑定一个不可变的值。

3.作用域

  • C语言中的const变量的作用域取决于其声明的位置。全局const变量在整个程序中可见,而局部const变量的作用域仅限于函数内部。

  • Rust语言中的const常量具有静态作用域,即它们在程序的整个生命周期内都是可见的,类似于C语言中的全局const变量。

4.内存存储

  • C语言中的const变量通常保存在程序的只读内存区域(ROM)中,具体的存储位置取决于变量的类型和编译器的实现。

  • Rust语言中的const常量的值在编译时就已经被确定,并且被直接嵌入到生成的可执行文件中。这意味着Rust的const常量不需要额外的内存分配,可以提高程序的性能。

Rust的const常量在编译时确定,并且具有静态作用域,而C语言的const变量在运行时确定,并且作用域取决于其声明的位置。

此外,Rust的const常量的值被直接嵌入到生成的可执行文件中,而C语言的const变量的值通常保存在程序的只读内存区域中。

Rust 常量

在Rust中,常量和变量有以下差异:

第一,常量不允许使用 mut。常量不仅仅默认不可变,而且自始至终不可变。

第二,常量使用 const 关键字而不是 let 关键字来声明,并且值的类型必须标注。

第三,常量可以在任何作用域中声明,包括全局作用域。

const MAX_POINTS: u32 = 100_000;

Rust 常量的命名约定是字母全部大写,使用下划线分隔单词,对数字字面量插入下划线,可提高可读性。

变量遮蔽(shadowing)

在 Rust 中,如果一个块作用域中的变量与外层作用域中的变量同名,那么在块内,外层作用域中的变量将被隐藏。

例如,在下面的代码中,变量 x 在外层作用域中被声明,但在内层作用域中被重新声明。在内部作用域中,变量 x 的值是 5,而不是外层作用域中的 10。

rust 复制代码
fn main() {
    let x = 5;
    {
        let x = x + 1;
        println!("The value of x in the inner scope is: {}", x);
    }
    println!("The value of x in the outer scope is: {}", x);
}

Rust中的变量遮蔽,与C语言中的变量隐藏,都是为了解决同名变量之间的冲突问题。

两者的差别在于:

  • 作用域:Rust中的变量遮蔽发生在同一作用域内,而C语言中的变量隐藏通常发生在嵌套的作用域之间。

  • 可见性:在Rust中,被遮蔽的变量在当前作用域内不再可见,而在C语言中,内部作用域的变量会隐藏外部作用域的同名变量,但外部作用域的变量在内部作用域之外仍然可见。

  • 目的:Rust中的变量遮蔽旨在提高代码的可读性和可维护性,避免在代码的不同部分意外地使用相同的变量名;而C语言中的变量隐藏允许在不同的作用域中使用相同的变量名,而不会相互干扰。

相关推荐
lie..3 分钟前
30天从零开始学AI应用开发(Day 19):项目二完结:RAG 知识库问答系统,把自己攒的资料变成私人顾问
开发语言·人工智能·python
SWAGGY..7 分钟前
【C++进阶】:(7)红黑树的原理与 C++ 实现:结构设计、插入调整及性质验证
android·java·开发语言·c++·算法
行者-全栈开发12 分钟前
华为云码道 CodeArts 实测:让 AI 用 Rust 写一个 Git 仓库健康度体检台「仓衡」
git·rust·tauri·桌面应用·ai 编程·华为云码道·codearts 代码智能体
miofly14 分钟前
GitHub 今日推荐|lightcraft:纯 Rust 重写的 RAW 照片开发工具
rust·开源·github
(Charon)15 分钟前
【C++面试】堆内存与栈内存:string、vector和对象到底存在哪里
开发语言·c++·面试
谢亮_vipxieliang24 分钟前
Go defer、panic与recover核心知识点
开发语言·后端·golang
迪康Defender37 分钟前
终端安全事后追溯能力解析:本地审计模块设计思路与落地实践
运维·开发语言·人工智能·安全·php·安全威胁分析·运维开发
yujunl40 分钟前
开发一个可以用APIFOX来调试的接口
开发语言
苏辰澈1 小时前
C++自己的族谱规则:继承详解下
c语言·开发语言·c++·visualstudio
hunter1990101 小时前
英语作文题目
开发语言