打印操作由std::fmt里面所定义的一系列宏来处理,包括:
format!:将格式化文本输出到字符串(String)print!:与format!类似,但将文本输出到控制台println!: 与print!类似,但输出结果追加一个换行符
| title | linkTitle | date | weight | description |
|---|---|---|---|---|
| Rust的表达式 | 表达式 | 2021-03-29 | 1140 | Rust的表达式 |
表达式主要用于计算求值。
Rust 编译器在解析代码时:
- 如果遇到分号,就会继续往后面执行
- 如果遇到语句,就会执行语句
- 如果遇到表达式,就会对表达式求值
- 如果分号后面什么都没有,就会补上单元值
() - 当遇到函数时,就会将函数体的花括号识别为块表达式。
块表达式是由一对花括号和一系列表达式组成的,它总是返回块中最后一个表达式的值。
位置表达式
位置表达式(Place Expression)一般叫做左值,是表示内存位置的表达式,有以下几类:
- 本地变量
- 静态变量
- 解引用 (* express)
- 数组索引 (expr[expr])
- 字段引用 (expr.field)
- 位置表达式组合
通过位置表达式可以对某个数据单元的内存进行读写。位置表达式可以用于赋值。
值表达式
值表达式(Value Expression)一般叫做右值,值表达式引用了某个存储单元地址中的数据。它相当于数据,只能进行读操作。
从语义角度来说,位置表达式代表了持久性数据,值表达式代表了临时数据。位置表达式一般有持久的状态,值表达式要不是字面量,要不就是表达式求值过程中创建的临时值。
宏类型
Rust中宏大致分为两类:
- 声明式宏: 它们是使用
macro_rules!宏创建的,它们提供与调用函数类似的功能,但是很容易通过名称末尾!给予区分。它们是在项目中快速编写小型宏的首选方法。macro_rules!宏可以在项目的任何位置定义。 - 过程宏: 过程宏是宏的一种高级形式,可以完全控制代码的操作和生成。这些宏没有任何DSL支持,并在某种意义上是程序性的,你必须给定的标记树输入编写如何生成或转换代码的指令。过程宏需要通过将
Cargo.toml文件中的属性设置为proc-macro=true来生成独立的软件包。
过程宏的缺点
过程宏实现起来比较复杂,需要对编译器的内部机制,以及程序如何在编译器的内存中表示有一些了解。
macro_rules! 宏的标记类型
代码块
如下代码块包含两条语句,分别是 silly; 和 things;。
{ sily; things; }
expr
匹配任意表达式:
1x + 1if x == 4 { 1 } else { 2 }
元项是在括号内找到的内容。因此,对于前面的每个属性,相应的元项如下所示: