Rust 基础语法

简介: 变量,基本类型,函数,注释和控制流,这些几乎是每种编程语言都具有的编程概念。

Rust 基础语法

变量,基本类型,函数,注释和控制流,这些几乎是每种编程语言都具有的编程概念。


这些基础概念将存在于每个 Rust 程序中,及早学习它们将使你以最快的速度学习 Rust 的使用。


变量

首先必须说明,Rust 是强类型语言,但具有自动判断变量类型的能力。这很容易让人与弱类型语言产生混淆。


如果要声明变量,需要使用 let 关键字。例如:


let a = 123;


只学习过 JavaScript 的开发者对这句话很敏感,只学习过 C 语言的开发者对这句话很不理解。


在这句声明语句之后,以下三行代码都是被禁止的:


a = "abc";
a = 4.56; 
a = 456;


第一行的错误在于当声明 a 是 123 以后,a 就被确定为整型数字,不能把字符串类型的值赋给它。


第二行的错误在于自动转换数字精度有损失,Rust 语言不允许精度有损失的自动数据类型转换。


第三行的错误在于 a 不是个可变变量。


前两种错误很容易理解,但第三个是什么意思?难道 a 不是个变量吗?


这就牵扯到了 Rust 语言为了高并发安全而做的设计:在语言层面尽量少的让变量的值可以改变。所以 a 的值不可变。但这不意味着 a 不是"变量"(英文中的 variable),官方文档称 a 这种变量为"不可变变量"。


如果我们编写的程序的一部分在假设值永远不会改变的情况下运行,而我们代码的另一部分在改变该值,那么代码的第一部分可能就不会按照设计的意图去运转。由于这种原因造成的错误很难在事后找到。这是 Rust 语言设计这种机制的原因。


当然,使变量变得"可变"(mutable)只需一个 mut 关键字。


let mut a = 123;
a = 456;


这个程序是正确的。


常量与不可变变量的区别

既然不可变变量是不可变的,那不就是常量吗?为什么叫变量?


变量和常量还是有区别的。在 Rust 中,以下程序是合法的:


let a = 123;   // 可以编译,但可能有警告,因为该变量没有被使用
let a = 456;


但是如果 a 是常量就不合法:


const a: i32 = 123;
let a = 456;


变量的值可以"重新绑定",但在"重新绑定"以前不能私自被改变,这样可以确保在每一次"绑定"之后的区域里编译器可以充分的推理程序逻辑。 虽然 Rust 有自动判断类型的功能,但有些情况下声明类型更加方便:


let a: u64 = 123;


这里声明了 a 为无符号 64 位整型变量,如果没有声明类型,a 将自动被判断为有符号 32 位整型变量,这对于 a 的取值范围有很大的影响。


重影(Shadowing)

重影的概念与其他面向对象语言里的"重写"(Override)或"重载"(Overload)是不一样的。重影就是刚才讲述的所谓"重新绑定",之所以加引号就是为了在没有介绍这个概念的时候代替一下概念。


重影就是指变量的名称可以被重新使用的机制:

实例

fn main() {  
    let x = 5;  
    let x = x + 1;  
    let x = x * 2;  
    println!("The value of x is: {}", x);  
}

f6562ecd0e0143bcc5a4de5de6f07c81_7206f27dc1fd4a12a134920a4e9ded28.png

这段程序的运行结果:


The value of x is: 12


重影与可变变量的赋值不是一个概念,重影是指用同一个名字重新代表另一个变量实体,其类型、可变属性和值都可以变化。但可变变量赋值仅能发生值的变化。


let mut s = "123";
s = s.len();


这段程序会出错:不能给字符串变量赋整型值。


总结

rust 作为强类型语言,但是也有自动判断类型的能力,所以它的使用有点类似于c++的size_t 或者 auto 。我们使用的关键字是 let。 可以简单记录为 let 走天下。创建变量? let。更新变量 ? let。


由此引出第二点,不再是传统的一次创建,任意更改。


在 rust中,由于为高并发而做的努力,它不再允许随意更改。

你可以想象在以往高并发中死锁和数据污染导致的令人头大的后果和补救措施,以及我们为此做出的巨大妥协和投入了大量的成本。

现在,我们将他限制住了。

每次修改变量时,有两种方式:


使用let关键字每次修改,重新声明。(既是重影)

这样使用时,编译会告警。

添加mut 关键字 (mutable)

let mut zry = 123;
zry = 432;
//但是类型修改时还是不行,这是原则问题>_<
zry = 'zry';
zry = 123.1;


后置的类型强声明


在rust 中,类型的声明是可以显式限制的,毕竟是强类型嘛。

在显式声明时, 语法为 变量后 :类型如:

let z: i32 = 123;
let r: u64 = 234;


其意义在于当我们想以更大的空间容纳数据但我又不想使用新的空间时,或者想要预留更大的空间时方便

重影


在学习Rust 的过程中,你会发现一些很酷的内容,我们在重定义变量这个操作时,不会直白的说,我在这里重定义了,而是说 重影。这个蛮中二的词雀氏让我有种高大冷峻的范。

那么实际重影做的是什么呢?我们之前说了Rust 并发安全,所以限制随意修改变量值。但我们有两种方式实现修改。第一种就是重影。

代码实现:

let z = 1;
let z = z+1;
let z = z*2;
let z = z*z;
printin!("z is {}",z);



mut 改变的只能是同类型值

8dbca35cbe0a66dea5140d043bdd273f_4935f51cfea54adfb33dbe1bb31dfbfc.png

目录
相关文章
|
24天前
|
存储 Rust 自然语言处理
Rust 基础语法和数据类型
Rust 基础语法和数据类型
38 0
|
24天前
|
Rust 算法 C++
【从 C++ 到 Rust:掌握 Rust 基础语法】From C++ to Rust: Mastering Rust Basics
【从 C++ 到 Rust:掌握 Rust 基础语法】From C++ to Rust: Mastering Rust Basics
52 0
|
Rust Java 开发者
【Rust指南】基础语法|基本数据类型|复合数据类型
【Rust指南】基础语法|基本数据类型|复合数据类型
96 0
|
24天前
|
Rust 安全 网络协议
Rust 笔记:Rust 语言中的枚举 与 模式匹配
Rust 笔记:Rust 语言中的枚举 与 模式匹配
49 0
|
3天前
|
机器学习/深度学习 Rust 安全
Rust语言:为何备受开发者青睐?
Rust编程语言以其内存安全、高性能、并发编程支持和强大社区获得青睐。作为系统编程语言,Rust的所有权与借用检查机制确保了内存安全,适用于高可靠性系统。它拥有接近C/C++的运行时性能,适合游戏开发和数据分析。Rust的并发特性包括轻量级线程和原子操作,便于构建高性能并发系统。活跃的社区和完善的生态系统,如丰富的库和框架,加速了开发者的学习和项目开发进程。【6月更文挑战第3天】
25 3
|
24天前
|
存储 Rust 安全
Rust 笔记:Rust 语言中的 所有权 与 生命周期
Rust 笔记:Rust 语言中的 所有权 与 生命周期
141 0
|
11天前
|
Rust 并行计算 安全
探索Rust语言在并发编程中的应用
探索Rust语言在并发编程中的应用
23 1
|
24天前
|
Rust 安全 程序员
开发语言漫谈-rust
if(){}else{}就是C家族的
|
24天前
|
Rust 监控 数据安全/隐私保护
Rust语言在员工屏幕监控系统中的应用指南
员工屏幕监控系统在现代企业管理中扮演着重要角色。它们能够帮助企业监控员工的活动,确保他们的工作效率和数据安全。在这篇文章中,我们将探讨如何使用Rust语言构建一个简单而高效的员工屏幕监控系统,并提供一些代码示例以帮助你入门。
146 0