Rust基本语法

发布时间:2023年12月17日

Rust基本语法

Hello World

fn main() {
    println!("Hello, world!");
}

Rust数据类型

Rust 是一种静态类型的语言。 Rust 中的每个值都是某种数据类型。 编译器可以根据分配给它的值自动推断变量的数据类型。

声明变量

使用关键词 let 声明变量。

直接赋值的场合Rust会自动的推断变量类型,在ide可以很方便的查看

Image1

fn main() {
   let company_string = "TutorialsPoint";  // string 类型
   let rating_float = 4.5;                 // float 类型
   let is_growing_boolean = true;          // boolean 类型
   let icon_char = '?';                    //unicode character 类型

   println!("company name is:{}",company_string);
   println!("company rating on 5 is:{}",rating_float);
   println!("company is growing :{}",is_growing_boolean);
   println!("company icon is:{}",icon_char);
}
在上面的代码示例中,变量的数据类型是从被分配的值而推断出来的。例如,变量 company_string 被 Rust 分配了 string 字符串数据类型,变量 rating_float 被分配了 float 浮点数据类型,等等。

println! 宏函数有两个参数

一个参数是占位符 { },特别的语法
一个参数是变量或者常量
占位符将被变量的值替换掉

上述代码片段将输出以下内容

company name is: TutorialsPoint
company rating on 5 is:4.5
company is growing: true
company icon is: ?

需要注意的是Rust的变量默认为不可变变量

Rust为了糕饼发进行设计,他的变量使用let关键词声明时是默认不可边的

比方说:

let a = 123;

而接下来的三句

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

都会报错,so why?

第一行的错误在于当声明 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);  
}  

这段程序的运行结果:

The value of x is: 12

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

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

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

文章来源:https://blog.csdn.net/qq_42901723/article/details/135031016
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。