Rust 基础语法(一) -- 变量、运算与注释

2022-05-21 20:38:10   最后更新: 2022-06-14 16:36:47   访问数量:236




 

上一篇文章中我们已经用 Rust 运行了 Hello World 程序,那么,接下来我们就来学习一下 Rust 的基础语法。

 

 

 

 

上一篇文章中,我们已经看到了 Rust 标准输出的例子:

 

fn main() { let a = 12; println!("a is {}", a); }

 

 

2.1 输出宏

 

在 Rust 规范中,宏均以 ! 结尾,用于标准输出的“函数”实际上就是通过宏来实现的。

Rust 用作标准输出的宏有两个:

 

  1. println!()
  2. print!()

 

两个的区别仅在于是否在末尾加上换行符。

 

2.2 占位符

 

上面的例子中,在输出参数中存在一个占位符 {},用来指代后面参数列表中的参数:

 

println!("a is {}, a again is {}", a, a);

 

 

在这个例子中,参数列表中的 a 出现了两次,看起来有些冗余,rust 允许在 {} 中加入数字来进行对参数列表进行索引:

 

println!("a is {0}, a again is {0}", a);

 

 

如何转义占位符,从而能够输出 {} 呢?

 

println!("{{}}");

 

 

这样就会输出:

 

{}

 

 

3.1 变量

 

在本文的第一个例子中,我们看到了 let 关键字。它用来声明变量:

 

let a = 123;

 

 

变量 a 在此声明之后,便拥有了类型,但我们并不能更改 a 的值,因为 a 并不是一个可变变量。

 

如果想让 a 被重新赋值,那么就需要用另一个关键字 mut 将变量标记为可变:

 

let mut a = 123; a = 456;

 

 

但是要记住,a 是有类型的,即便 a 是可变的,仍然不能为 a 赋予其他类型的值。

 

3.2 重影

 

尽管不可变变量不能被重新赋值,但它是可以被重新声明的,通过重新声明可以重新绑定这一变量,从而为变量赋予新的值。

 

fn main() { let a = 123; let a = "xyz"; println!("The value of a is {}", a); }

 

 

例如你可以这样使用重影机制:

 

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

 

3.3 常量

 

变量默认是不可变的,除非用 mut 关键字修饰,常量则永远都是不可变的。

在 Rust 中,我们需要这样来创建常量:

const NUMBER:i32 = 5;

 

 

常量与变量的区别体现在以下几点:

  1. 变量通过 let 关键字创建,常量通过 const 关键字创建;
  2. 常量必须在声明时显式标注类型;
  3. 常量可以被声明在任何作用域中,包括全局作用域中;
  4. 函数返回值等其他需要在运行时计算的值不能被绑定到常量上。

 

 

和其他语言类似,Rust 中数据类型也分为以下几个类型:

 

  1. 整型
  2. 浮点型
  3. 布尔型
  4. 字符型
  5. 数组类型

 

4.1 整型

 

位长度 有符号 无符号
8-bit i8 u8
16-bit i16 u16
32-bit i32 u32
64-bit i64 u64
128-bit i128 u128
arch isize usize

isize 和 usize 两种整数类型是用来衡量数据大小的,它们的位长度取决于所运行的目标平台,通常用作索引值来使用。

 

整型数的不同进制的写法有以下几种:

 

进制
十进制 98_222
十六进制 0xff
八进制 0o77
二进制 0b1111_0000
字节(只能表示 u8 型) b'A'

可以在变量声明时指定变量类型:

 

fn main() { let x:i32 = 123; }

 

 

4.2 浮点型

 

浮点型分为 32 位浮点数 f32 和 64 浮点数 f64。

 

fn main() { let x = 2.0; // f64 let y: f32 = 3.0; // f32 }

 

 

4.3 布尔型

 

布尔型有两个取值:

 

  • true
  • false

 

4.4 字符型

 

Rust 中的字符型用 char 表示,大小为 4 字节,中文字符串则强制使用 UTF-8 编码。

 

4.5 复合类型

 

与其他语言非常类似,数组和元组就是一组数据的集合。

 

  • 需要注意的是,rust 中的数组和元组的元素都是不可变的,也就是说声明后不能更新数组或元组中的某个元素。

 

1. 元组

 

元组是通过一堆括号包括的一组数据,可以拥有不同的数据类型,但一经定义就不能改变其大小:

 

let tup: (i32, f64, u8) = (500, 6.4, 1); // tup.0 等于 500 // tup.1 等于 6.4 // tup.2 等于 1 let (x, y, z) = tup; // y 等于 6.4 let x = tup.0; let y = tup.1; // x 等于 500; y 等于 6.4

 

 

2. 数组

 

数组使用方括号包括的一组数据,这些数据必须是相同类型,且同样拥有固定的长度:

 

let a = [1, 2, 3, 4, 5];

 

 

你同样也可以显式声明数组的类型:

let a: [i32; 5] = [1, 2, 3, 4, 5]; let b = a[3]; // b 等于 4

 

 

在方括号中,i32 表示数组元素的类型,5 表示数组的长度

 

 

rust 支持基本的数学运算,如:

 

  • 加:+
  • 减:-
  • 乘:*
  • 除:/
  • 取余:%
  • 赋值数学运算:+=、-= 等
  • Rust 不支持 ++ 与 -- 操作

 

 

和许多其他语言一样,Rust 支持下面的三种注释:

 

// 这是第一种注释方式

 

 

/* 这是第二种注释方式 */

 

 

/* * 多行注释 * 多行注释 * 多行注释 */

 

 

除此以外,rust 还有一种特殊的用于说明文档的注释:

 

/// Adds one to the number given. /// /// # Examples /// /// ``` /// let x = add(1, 2); /// /// ``` fn add(a: i32, b: i32) -> i32 { return a + b; } fn main() { println!("{}",add(2,3)); }

 

 

Cargo 的 cargo doc 功能可以自动将文档书名注释变成 html 格式的说明文档。

 

 

欢迎关注微信公众号,以技术为主,涉及历史、人文等多领域的学习与感悟,每周三到七篇推文,只有全部原创,只有干货没有鸡汤

 

Rust 专题

 






变量      rust      运算      注释      标准输出     


京ICP备2021035038号