Rust 变量和常量篇章

曾写js,最近发现了rust,感觉很好,记录下我的学习笔记。以下分几点细致说明它和js的区别

变量

一.变量绑定(变量赋值)

在js中我们用let a = "hello world" 来给a赋值。这个代码在rust里解释稍稍有点区别,就是rust特别定义的所有权。意思是变量a拥有hello world这个字符的所有权。简单来讲,任何内存对象都是有主人的,而且一般情况下完全属于它的主人,绑定就是把这个对象绑定给一个变量,让这个变量成为它的主人(聪明的读者应该能猜到,在这种情况下,该对象之前的主人就会丧失对该对象的所有权)。

二.变量可变性

rust默认变量不可变,这和js区别很大。在js里let a = "hello world" 可以变成let a = "hello world"; a="big pig" ,这在js里是符合规矩的。但在rust里,这是不合法的。

这是 Rust 团队为我们精心设计的语言特性之一,让我们编写的代码更安全,性能也更好。当然你可以通过 mut 关键字让变量变为可变的,让设计更灵活。

这样设计是为了避免无法预期的错误发生在我们的变量上:一个变量往往被多处代码所使用,其中一部分代码假定该变量的值永远不会改变,而另外一部分代码却无情的改变了这个值,在实际开发过程中,这个错误是很难被发现的,特别是在多线程编程中。 这种规则让我们的代码变得非常清晰,只有你想让你的变量改变时,它才能改变,这样就不会造成心智上的负担,也给别人阅读代码带来便利。

这里需要注意,mut可以修改变量值,而不可以修改变量类型哦

三.未使用的变量

如果你创建了一个变量却不在任何地方使用它,Rust 通常会给你一个警告,因为这可能会是个 BUG。但是有时创建一个不会被使用的变量是有用的,比如你正在设计原型或刚刚开始一个项目。这时你希望告诉 Rust 不要警告未使用的变量,为此可以用下划线作为变量名的开头

四.变量解构

let 表达式不仅仅用于变量的绑定,还能进行复杂变量的解构:从一个相对复杂的变量中,匹配出该变量的一部分内容:

五. 变量遮蔽(shadowing)

Rust 允许声明相同的变量名,在后面声明的变量会遮蔽掉前面声明的.这和js有点像。

rs 复制代码
fn main() {
    let x = 5;
    // 在main函数的作用域内对之前的x进行遮蔽
    let x = x + 1;
    {
        // 在当前的花括号作用域内,对之前的x进行遮蔽
        let x = x * 2;
        println!("The value of x in the inner scope is: {}", x);
    }
    println!("The value of x is: {}", x);
}

这和 mut 变量的使用是不同的,第二个 let 生成了完全不同的新变量,两个变量只是恰好拥有同样的名称,涉及一次内存对象的再分配 ,而 mut 声明的变量,可以修改同一个内存地址上的值,并不会发生内存对象的再分配,性能要更好。

变量遮蔽的用处在于,如果你在某个作用域内无需再使用之前的变量(在被遮蔽后,无法再访问到之前的同名变量),就可以重复的使用变量名字,而不用绞尽脑汁去想更多的名字。

常量

常量 (constant)。与不可变变量一样,常量也是绑定到一个常量名且不允许更改的值,但是常量和变量之间存在一些差异:

  • 常量不允许使用 mut常量不仅仅默认不可变,而且自始至终不可变,因为常量在编译完成后,已经确定它的值。

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

  • Rust 常量的命名约定是全部字母都使用大写,并使用下划线分隔单词,另外对数字字面量可插入下划线以提高可读性,如:const MAX_POINTS: u32 = 100_000

相关推荐
明月与玄武2 小时前
Python编程的真谛:超越语法,理解编程本质
python·编程语言
景天科技苑2 小时前
【Rust】Rust中的枚举与模式匹配,原理解析与应用实战
开发语言·后端·rust·match·enum·枚举与模式匹配·rust枚举与模式匹配
红尘散仙3 小时前
七、WebGPU 基础入门——Texture 纹理
前端·rust·gpu
红尘散仙3 小时前
八、WebGPU 基础入门——加载图像纹理
前端·rust·gpu
w4ngzhen3 小时前
关于Bevy中的原型Archetypes
rust·游戏开发
cloudy4913 小时前
强化学习:历史基金净产值,学习最大化长期收益
python·强化学习
sayornottt5 小时前
Rust中的动态分发
后端·rust
胡攀峰13 小时前
第12章 微调生成模型
人工智能·大模型·llm·sft·强化学习·rlhf·指令微调
YiSLWLL13 小时前
使用Tauri 2.3.1+Leptos 0.7.8开发桌面小程序汇总
python·rust·sqlite·matplotlib·visual studio code
yu41062113 小时前
Rust 语言使用场景分析
开发语言·后端·rust