# Rust基本概念

从现在开始，我们正式踏入了Rust大陆，这篇广袤而神秘的世界，在这个世界中，将接触到很多之前都没有听过的概念：
- 所有权、借用、生命周期
- 宏编程
- 模式匹配

类似的还有很多，不过不用怕，引用武林外传一句话：咱上面有人。有本书在，一切虚妄终将烟消云散。

本章主要介绍Rust的基础语法、数据类型、项目结构等，学完本章，你将对Rust代码有一个清晰、完整的认识。

开始之前先通过一段代码来简单浏览下Rust的语法:

```rust
// rust程序入口函数，跟其它语言一样，都是main，该函数目前无返回值
fn main() {
   // 使用let来声明变量，进行绑定，a是不可变的
   // 此处没有指定a的类型，编译器会默认根据a的值为a推断类型：i32，有符号32位整数
   // 语句的末尾必须以分号结尾
   let a = 10;
   // 主动指定b的类型为i32
   let b: i32 = 20;
   // 这里有两点值得注意：
   // 1. 可以在数值中带上类型:30i32表示数值是30，类型是i32
   // 2. c是可变的，mut是mutable的缩写
   let mut c = 30i32;
   // 还能在数值和类型中间添加一个下划线，让可读性更好
   let d = 30_i32;
   // 跟其它语言一样，可以使用一个函数的返回值来作为另一个函数的参数
   let e = add(add(a, b), add(c, d));
    
   // println!是宏调用，看起来像是函数但是它返回的是宏定义的代码块
   // 该函数将指定的格式化字符串输出到标准输出中(控制台)
   // {}是占位符，在具体执行过程中，会把e的值代入进来
   println!("( a + b ) + ( c + d ) = {}", e);
 }
 
 // 定义一个函数，输入两个i32类型的32位有符号整数，返回它们的和
 fn add(i: i32, j: i32) -> i32 {
   // 返回相加值，这里可以省略return
   i + j
 }
```

> 注意
>在上面的`add`函数中，不要为`i+j`添加`;`，这会改变语法导致函数返回`()`而不是`i32`,具体参见[语句和表达式](./base-type/statement-expression.md)

有几点可以留意下:
- 字符串使用双引号`""`而不是单引号`''`, Rust中单引号是留给单个字符类型(`char`)使用的
- Rust使用`{}`来作为格式化输出占位符，其它语言可能使用的是`%s`，`%d`,`%p`等，由于`println!`会自动推导出具体的类型, 因此无需手动指定
