Rust

Rust

Rust不安全的代码,编写unsafe rust code需要注意些什么?

Rust网站管理员 Published the article • 0 comments • 80 views • 2019-08-31 14:54 • 来自相关话题

### 不安全的Rust代码 unsafe

Rust隐藏着第二种语言,它不会强制执行这类内存安全保障:这个被称为不安全的Rust(unsafe Rust)。与常规的Rust代码无异,但是它提供了额外的超级力量。
为什么会存在Unsafe Rust代码,其本质就是Rust本身静态分析保守导致。

### 有哪些超级力量呢?

1. 解引用裸指针
2. 调用不安全的函数或者方法
3. 访问或者修改可变静态变量
4. 实现不安全的trait

### 解引用裸指针

裸指针是可变或者不可变的,分别写作`*mut T`和`*const T`。这里的`*`不是解引用运算符,它是类型名称的一部分。在裸指针的上下文中,不可变意味着指针解引用之后不能直接赋值。

与引用和智能指针的区别在于,记住裸指针

1. 允许忽略借用规则,可以同时拥有不可变和可变的指针,或多个指向相同位置的可变指针
2. 不保证指向有效的内存
3. 允许为空
4. 不能实现任何自动清理工作

### 注意

不安全的代码必须用`unsafe`括起来,组成代码块,或者函数前标记该方法或者函数是不安全的
```rust
unsafe {
// your code
}

unsafe fn test(inc: u32) {
// your code
}

// for example
static HELLO_WORLD: &str = "hello world!";

static mut COUNTER: u32 = 0;

fn main() {
println!("name is: {}", HELLO_WORLD);

unsafe {
add_to_count(4);
println!("count is: {}", COUNTER);
}
}

unsafe fn add_to_count(inc: u32) {
COUNTER += inc;
}

``` 查看全部
### 不安全的Rust代码 unsafe

Rust隐藏着第二种语言,它不会强制执行这类内存安全保障:这个被称为不安全的Rust(unsafe Rust)。与常规的Rust代码无异,但是它提供了额外的超级力量。
为什么会存在Unsafe Rust代码,其本质就是Rust本身静态分析保守导致。

### 有哪些超级力量呢?

1. 解引用裸指针
2. 调用不安全的函数或者方法
3. 访问或者修改可变静态变量
4. 实现不安全的trait

### 解引用裸指针

裸指针是可变或者不可变的,分别写作`*mut T`和`*const T`。这里的`*`不是解引用运算符,它是类型名称的一部分。在裸指针的上下文中,不可变意味着指针解引用之后不能直接赋值。

与引用和智能指针的区别在于,记住裸指针

1. 允许忽略借用规则,可以同时拥有不可变和可变的指针,或多个指向相同位置的可变指针
2. 不保证指向有效的内存
3. 允许为空
4. 不能实现任何自动清理工作

### 注意

不安全的代码必须用`unsafe`括起来,组成代码块,或者函数前标记该方法或者函数是不安全的
```rust
unsafe {
// your code
}

unsafe fn test(inc: u32) {
// your code
}

// for example
static HELLO_WORLD: &str = "hello world!";

static mut COUNTER: u32 = 0;

fn main() {
println!("name is: {}", HELLO_WORLD);

unsafe {
add_to_count(4);
println!("count is: {}", COUNTER);
}
}

unsafe fn add_to_count(inc: u32) {
COUNTER += inc;
}

```

Rust 引用变量的生命周期,编译器的借用检查器确保你的代码安全可靠

后端开发网站管理员 Published the article • 0 comments • 123 views • 2019-07-28 16:47 • 来自相关话题

## Rust lifetime

### Borrow Checker 借用检查器

#### 代码块

Rust编译器会在编译的时候比较作用域变量的生命周期。
Rust官方文档中有如下示例:
```rust
{
let r; // ---------+-- 'a
// |
{ // |
let x = 5; // -+-- 'b |
r = &x; // | |
} // -+ |
// |
println!("r: {}", r); // |
}
```

从中我们可以看出,里面括号里的代码块,变量x的作用域局限在里面的括号里,所以它的生命周期明显只有在这个括号里,对比变量r,r的生命周期要比x长,这个时候又将x的引用赋值给r,编译器会报错,因为后面的`println!("r: {}", r);`打印的r,其实是x。

### 在函数中分配生命周期

函数传参数,参数为引用,为什么要传引用呢?不想让函数拥有参数的所有权。

```rust
&i32 // 这是一个引用
&'a i32 // 这是一个有着详细生命周期的引用
&'a mut i32 // 这是一个有着详细生命周期的可变引用

fn longest &'a str {
x
}

// 错误案例
fn longest 查看全部

## Rust lifetime

### Borrow Checker 借用检查器

#### 代码块

Rust编译器会在编译的时候比较作用域变量的生命周期。
Rust官方文档中有如下示例:
```rust
{
let r; // ---------+-- 'a
// |
{ // |
let x = 5; // -+-- 'b |
r = &x; // | |
} // -+ |
// |
println!("r: {}", r); // |
}
```

从中我们可以看出,里面括号里的代码块,变量x的作用域局限在里面的括号里,所以它的生命周期明显只有在这个括号里,对比变量r,r的生命周期要比x长,这个时候又将x的引用赋值给r,编译器会报错,因为后面的`println!("r: {}", r);`打印的r,其实是x。

### 在函数中分配生命周期

函数传参数,参数为引用,为什么要传引用呢?不想让函数拥有参数的所有权。

```rust
&i32 // 这是一个引用
&'a i32 // 这是一个有着详细生命周期的引用
&'a mut i32 // 这是一个有着详细生命周期的可变引用

fn longest<'a>(x: &'a str, y: &str) -> &'a str {
x
}

// 错误案例
fn longest<'a>(x: &str, y: &str) -> &'a str {
let result = String::from("really long string");
result.as_str()
}
```
为什么的个函数`longest`会报错呢?原因是result的生命周期要比`'a`短。

### 在结构体定义里标记生命周期

### 哪些规则不需要为引用声明生命周期(lifetime elision rules)生命周期省略

每一个引用都有一个生命周期

在函数或者方法参数中,生命周期被称作输入生命周期,相反,返回值的被称作输出生命周期。

#### 生命周期省略规则

第一条适用于输入生命周期,后面两条则适用于输出生命周期。适用于`fn`和`impl`块。
只有满足如下三点,就可以不用声明生命周期。

1. 每一个引用参数都有自己的一个生命周期。
2. 如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数。
3. 多个输入生命周期参数,`&self`或`&mult self`,self的生命周期被赋给所有输出生命周期参数。




【Rust Lang进击之路】如何入门Rust,从配置环境和阅读官方文档开始

后端开发网站管理员 Published the article • 0 comments • 199 views • 2019-07-27 00:28 • 来自相关话题

### 如何入门rust-lang,从官方文档阅读开始

为什么要学习Rust?Rust学习曲线高,入门也不简单,看看Rust的自荐。

> 一门赋予每个人
> 构建可靠且高效软件能力的语言。

1. 高性能
- Rust 速度惊人且内存利用率极高。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。

2. 可靠性
- Rust 丰富的类型系统和所有权模型保证了内存安全和线程安全,让您在编译期就能够消除各种各样的错误。

3. 生产力
- Rust 拥有出色的文档、友好的编译器和清晰的错误提示信息, 还集成了一流的工具 —— 包管理器和构建工具, 智能地自动补全和类型检验的多编辑器支持, 以及自动格式化代码等等。


#### 官方文档

- [中文文档](https://www.rust-lang.org/zh-CN/)
- [英文文档](https://www.rust-lang.org/learn)

#### 安装rust-lang IDE

Jetbrains是一家开发IDE的公司,旗下有很多优秀的IDE,phpstorm、goland、webstore、pyCharm等,今天我们要用到的是Intellij,然后我们可以在他的插件管理器中下载rust的插件,安装完毕之后,我们可以重启IDE,创建rust应用程序。

如果需要研究阅读插件的源代码,跟进插件的特性,可以[在github上](https://intellij-rust.github.io/)讨论。

#### 关于rust-lang的环境配置

官方提供了很优秀的解决方案,[Install Rust](https://www.rust-lang.org/tools/install),不知道从什么时候开始,学习东西喜欢从它的官方文档先开始研究。
> It looks like you’re running macOS, Linux, or another Unix-like OS. To download Rustup and install Rust, run the following in your terminal, then follow the on-screen instructions.
官方提供的方法其实很简单,是一个自动化安装的shell脚本,curl下载shell脚本,一键部署安装环境,十分的简单方便。

```bash
curl https://sh.rustup.rs -sSf | sh
```

#### 阅读文档,从`Hello world`程序开始我们的rust

开始我们的rust`hello world`程序之旅,不得不提一下cargo,rust的包管理工具(Rust's package manager)。

##### 首先我们需要通过`cargo`创建一个rust的项目

在命令行执行`cargo new hello-world`,然后cargo管理器就为我们创建了一个hello-world的目录,这个目录如下:
```
.
├── Cargo.lock
├── Cargo.toml
└── src
└── main.rs
```

其实`cargo new`,会直接给我们自动生成一个hello world的程序,代码如下
```rust
fn main() {
println!("Hello, world!");
}
```
然后我们只需要执行如下脚本,cargo会帮我们自动生成可执行文件,并且执行输出结果。
```bash

cargo run
# Compiling hello-demo v0.1.0 (/Users/demo/project/hello-demo)
# Finished dev [unoptimized + debuginfo] target(s) in 0.78s
# Running `target/debug/hello-demo`
# Hello world
```

##### 使用Rustc编译.rs文件

```bash
Rustc src/main.rs
./main

# Hello world
```

### Rust HelloWorld程序分析

Rust可执行程序一定需要一个入口文件,和C/C++一样,需要一个`manin`函数,关键词`fn`表示函数,宏`println!`可以帮助我们打印输出。
为什么说长得像函数的`println!`是宏,如果你观察仔细的话,你会发现宏是在函数后面增加了一个感叹号`!`,这个标识标识它就是宏。
关于宏的介绍,后面我会弄个专栏来介绍它。宏不管是在C还是Rust中,都十分的强大。相信你也会喜欢这门语言的。 查看全部
### 如何入门rust-lang,从官方文档阅读开始

为什么要学习Rust?Rust学习曲线高,入门也不简单,看看Rust的自荐。

> 一门赋予每个人
> 构建可靠且高效软件能力的语言。

1. 高性能
- Rust 速度惊人且内存利用率极高。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。

2. 可靠性
- Rust 丰富的类型系统和所有权模型保证了内存安全和线程安全,让您在编译期就能够消除各种各样的错误。

3. 生产力
- Rust 拥有出色的文档、友好的编译器和清晰的错误提示信息, 还集成了一流的工具 —— 包管理器和构建工具, 智能地自动补全和类型检验的多编辑器支持, 以及自动格式化代码等等。


#### 官方文档

- [中文文档](https://www.rust-lang.org/zh-CN/)
- [英文文档](https://www.rust-lang.org/learn)

#### 安装rust-lang IDE

Jetbrains是一家开发IDE的公司,旗下有很多优秀的IDE,phpstorm、goland、webstore、pyCharm等,今天我们要用到的是Intellij,然后我们可以在他的插件管理器中下载rust的插件,安装完毕之后,我们可以重启IDE,创建rust应用程序。

如果需要研究阅读插件的源代码,跟进插件的特性,可以[在github上](https://intellij-rust.github.io/)讨论。

#### 关于rust-lang的环境配置

官方提供了很优秀的解决方案,[Install Rust](https://www.rust-lang.org/tools/install),不知道从什么时候开始,学习东西喜欢从它的官方文档先开始研究。
> It looks like you’re running macOS, Linux, or another Unix-like OS. To download Rustup and install Rust, run the following in your terminal, then follow the on-screen instructions.
官方提供的方法其实很简单,是一个自动化安装的shell脚本,curl下载shell脚本,一键部署安装环境,十分的简单方便。

```bash
curl https://sh.rustup.rs -sSf | sh
```

#### 阅读文档,从`Hello world`程序开始我们的rust

开始我们的rust`hello world`程序之旅,不得不提一下cargo,rust的包管理工具(Rust's package manager)。

##### 首先我们需要通过`cargo`创建一个rust的项目

在命令行执行`cargo new hello-world`,然后cargo管理器就为我们创建了一个hello-world的目录,这个目录如下:
```
.
├── Cargo.lock
├── Cargo.toml
└── src
└── main.rs
```

其实`cargo new`,会直接给我们自动生成一个hello world的程序,代码如下
```rust
fn main() {
println!("Hello, world!");
}
```
然后我们只需要执行如下脚本,cargo会帮我们自动生成可执行文件,并且执行输出结果。
```bash

cargo run
# Compiling hello-demo v0.1.0 (/Users/demo/project/hello-demo)
# Finished dev [unoptimized + debuginfo] target(s) in 0.78s
# Running `target/debug/hello-demo`
# Hello world
```

##### 使用Rustc编译.rs文件

```bash
Rustc src/main.rs
./main

# Hello world
```

### Rust HelloWorld程序分析

Rust可执行程序一定需要一个入口文件,和C/C++一样,需要一个`manin`函数,关键词`fn`表示函数,宏`println!`可以帮助我们打印输出。
为什么说长得像函数的`println!`是宏,如果你观察仔细的话,你会发现宏是在函数后面增加了一个感叹号`!`,这个标识标识它就是宏。
关于宏的介绍,后面我会弄个专栏来介绍它。宏不管是在C还是Rust中,都十分的强大。相信你也会喜欢这门语言的。

Rust不安全的代码,编写unsafe rust code需要注意些什么?

Rust网站管理员 Published the article • 0 comments • 80 views • 2019-08-31 14:54 • 来自相关话题

### 不安全的Rust代码 unsafe

Rust隐藏着第二种语言,它不会强制执行这类内存安全保障:这个被称为不安全的Rust(unsafe Rust)。与常规的Rust代码无异,但是它提供了额外的超级力量。
为什么会存在Unsafe Rust代码,其本质就是Rust本身静态分析保守导致。

### 有哪些超级力量呢?

1. 解引用裸指针
2. 调用不安全的函数或者方法
3. 访问或者修改可变静态变量
4. 实现不安全的trait

### 解引用裸指针

裸指针是可变或者不可变的,分别写作`*mut T`和`*const T`。这里的`*`不是解引用运算符,它是类型名称的一部分。在裸指针的上下文中,不可变意味着指针解引用之后不能直接赋值。

与引用和智能指针的区别在于,记住裸指针

1. 允许忽略借用规则,可以同时拥有不可变和可变的指针,或多个指向相同位置的可变指针
2. 不保证指向有效的内存
3. 允许为空
4. 不能实现任何自动清理工作

### 注意

不安全的代码必须用`unsafe`括起来,组成代码块,或者函数前标记该方法或者函数是不安全的
```rust
unsafe {
// your code
}

unsafe fn test(inc: u32) {
// your code
}

// for example
static HELLO_WORLD: &str = "hello world!";

static mut COUNTER: u32 = 0;

fn main() {
println!("name is: {}", HELLO_WORLD);

unsafe {
add_to_count(4);
println!("count is: {}", COUNTER);
}
}

unsafe fn add_to_count(inc: u32) {
COUNTER += inc;
}

``` 查看全部
### 不安全的Rust代码 unsafe

Rust隐藏着第二种语言,它不会强制执行这类内存安全保障:这个被称为不安全的Rust(unsafe Rust)。与常规的Rust代码无异,但是它提供了额外的超级力量。
为什么会存在Unsafe Rust代码,其本质就是Rust本身静态分析保守导致。

### 有哪些超级力量呢?

1. 解引用裸指针
2. 调用不安全的函数或者方法
3. 访问或者修改可变静态变量
4. 实现不安全的trait

### 解引用裸指针

裸指针是可变或者不可变的,分别写作`*mut T`和`*const T`。这里的`*`不是解引用运算符,它是类型名称的一部分。在裸指针的上下文中,不可变意味着指针解引用之后不能直接赋值。

与引用和智能指针的区别在于,记住裸指针

1. 允许忽略借用规则,可以同时拥有不可变和可变的指针,或多个指向相同位置的可变指针
2. 不保证指向有效的内存
3. 允许为空
4. 不能实现任何自动清理工作

### 注意

不安全的代码必须用`unsafe`括起来,组成代码块,或者函数前标记该方法或者函数是不安全的
```rust
unsafe {
// your code
}

unsafe fn test(inc: u32) {
// your code
}

// for example
static HELLO_WORLD: &str = "hello world!";

static mut COUNTER: u32 = 0;

fn main() {
println!("name is: {}", HELLO_WORLD);

unsafe {
add_to_count(4);
println!("count is: {}", COUNTER);
}
}

unsafe fn add_to_count(inc: u32) {
COUNTER += inc;
}

```

Rust 引用变量的生命周期,编译器的借用检查器确保你的代码安全可靠

后端开发网站管理员 Published the article • 0 comments • 123 views • 2019-07-28 16:47 • 来自相关话题

## Rust lifetime

### Borrow Checker 借用检查器

#### 代码块

Rust编译器会在编译的时候比较作用域变量的生命周期。
Rust官方文档中有如下示例:
```rust
{
let r; // ---------+-- 'a
// |
{ // |
let x = 5; // -+-- 'b |
r = &x; // | |
} // -+ |
// |
println!("r: {}", r); // |
}
```

从中我们可以看出,里面括号里的代码块,变量x的作用域局限在里面的括号里,所以它的生命周期明显只有在这个括号里,对比变量r,r的生命周期要比x长,这个时候又将x的引用赋值给r,编译器会报错,因为后面的`println!("r: {}", r);`打印的r,其实是x。

### 在函数中分配生命周期

函数传参数,参数为引用,为什么要传引用呢?不想让函数拥有参数的所有权。

```rust
&i32 // 这是一个引用
&'a i32 // 这是一个有着详细生命周期的引用
&'a mut i32 // 这是一个有着详细生命周期的可变引用

fn longest &'a str {
x
}

// 错误案例
fn longest 查看全部

## Rust lifetime

### Borrow Checker 借用检查器

#### 代码块

Rust编译器会在编译的时候比较作用域变量的生命周期。
Rust官方文档中有如下示例:
```rust
{
let r; // ---------+-- 'a
// |
{ // |
let x = 5; // -+-- 'b |
r = &x; // | |
} // -+ |
// |
println!("r: {}", r); // |
}
```

从中我们可以看出,里面括号里的代码块,变量x的作用域局限在里面的括号里,所以它的生命周期明显只有在这个括号里,对比变量r,r的生命周期要比x长,这个时候又将x的引用赋值给r,编译器会报错,因为后面的`println!("r: {}", r);`打印的r,其实是x。

### 在函数中分配生命周期

函数传参数,参数为引用,为什么要传引用呢?不想让函数拥有参数的所有权。

```rust
&i32 // 这是一个引用
&'a i32 // 这是一个有着详细生命周期的引用
&'a mut i32 // 这是一个有着详细生命周期的可变引用

fn longest<'a>(x: &'a str, y: &str) -> &'a str {
x
}

// 错误案例
fn longest<'a>(x: &str, y: &str) -> &'a str {
let result = String::from("really long string");
result.as_str()
}
```
为什么的个函数`longest`会报错呢?原因是result的生命周期要比`'a`短。

### 在结构体定义里标记生命周期

### 哪些规则不需要为引用声明生命周期(lifetime elision rules)生命周期省略

每一个引用都有一个生命周期

在函数或者方法参数中,生命周期被称作输入生命周期,相反,返回值的被称作输出生命周期。

#### 生命周期省略规则

第一条适用于输入生命周期,后面两条则适用于输出生命周期。适用于`fn`和`impl`块。
只有满足如下三点,就可以不用声明生命周期。

1. 每一个引用参数都有自己的一个生命周期。
2. 如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数。
3. 多个输入生命周期参数,`&self`或`&mult self`,self的生命周期被赋给所有输出生命周期参数。




【Rust Lang进击之路】如何入门Rust,从配置环境和阅读官方文档开始

后端开发网站管理员 Published the article • 0 comments • 199 views • 2019-07-27 00:28 • 来自相关话题

### 如何入门rust-lang,从官方文档阅读开始

为什么要学习Rust?Rust学习曲线高,入门也不简单,看看Rust的自荐。

> 一门赋予每个人
> 构建可靠且高效软件能力的语言。

1. 高性能
- Rust 速度惊人且内存利用率极高。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。

2. 可靠性
- Rust 丰富的类型系统和所有权模型保证了内存安全和线程安全,让您在编译期就能够消除各种各样的错误。

3. 生产力
- Rust 拥有出色的文档、友好的编译器和清晰的错误提示信息, 还集成了一流的工具 —— 包管理器和构建工具, 智能地自动补全和类型检验的多编辑器支持, 以及自动格式化代码等等。


#### 官方文档

- [中文文档](https://www.rust-lang.org/zh-CN/)
- [英文文档](https://www.rust-lang.org/learn)

#### 安装rust-lang IDE

Jetbrains是一家开发IDE的公司,旗下有很多优秀的IDE,phpstorm、goland、webstore、pyCharm等,今天我们要用到的是Intellij,然后我们可以在他的插件管理器中下载rust的插件,安装完毕之后,我们可以重启IDE,创建rust应用程序。

如果需要研究阅读插件的源代码,跟进插件的特性,可以[在github上](https://intellij-rust.github.io/)讨论。

#### 关于rust-lang的环境配置

官方提供了很优秀的解决方案,[Install Rust](https://www.rust-lang.org/tools/install),不知道从什么时候开始,学习东西喜欢从它的官方文档先开始研究。
> It looks like you’re running macOS, Linux, or another Unix-like OS. To download Rustup and install Rust, run the following in your terminal, then follow the on-screen instructions.
官方提供的方法其实很简单,是一个自动化安装的shell脚本,curl下载shell脚本,一键部署安装环境,十分的简单方便。

```bash
curl https://sh.rustup.rs -sSf | sh
```

#### 阅读文档,从`Hello world`程序开始我们的rust

开始我们的rust`hello world`程序之旅,不得不提一下cargo,rust的包管理工具(Rust's package manager)。

##### 首先我们需要通过`cargo`创建一个rust的项目

在命令行执行`cargo new hello-world`,然后cargo管理器就为我们创建了一个hello-world的目录,这个目录如下:
```
.
├── Cargo.lock
├── Cargo.toml
└── src
└── main.rs
```

其实`cargo new`,会直接给我们自动生成一个hello world的程序,代码如下
```rust
fn main() {
println!("Hello, world!");
}
```
然后我们只需要执行如下脚本,cargo会帮我们自动生成可执行文件,并且执行输出结果。
```bash

cargo run
# Compiling hello-demo v0.1.0 (/Users/demo/project/hello-demo)
# Finished dev [unoptimized + debuginfo] target(s) in 0.78s
# Running `target/debug/hello-demo`
# Hello world
```

##### 使用Rustc编译.rs文件

```bash
Rustc src/main.rs
./main

# Hello world
```

### Rust HelloWorld程序分析

Rust可执行程序一定需要一个入口文件,和C/C++一样,需要一个`manin`函数,关键词`fn`表示函数,宏`println!`可以帮助我们打印输出。
为什么说长得像函数的`println!`是宏,如果你观察仔细的话,你会发现宏是在函数后面增加了一个感叹号`!`,这个标识标识它就是宏。
关于宏的介绍,后面我会弄个专栏来介绍它。宏不管是在C还是Rust中,都十分的强大。相信你也会喜欢这门语言的。 查看全部
### 如何入门rust-lang,从官方文档阅读开始

为什么要学习Rust?Rust学习曲线高,入门也不简单,看看Rust的自荐。

> 一门赋予每个人
> 构建可靠且高效软件能力的语言。

1. 高性能
- Rust 速度惊人且内存利用率极高。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。

2. 可靠性
- Rust 丰富的类型系统和所有权模型保证了内存安全和线程安全,让您在编译期就能够消除各种各样的错误。

3. 生产力
- Rust 拥有出色的文档、友好的编译器和清晰的错误提示信息, 还集成了一流的工具 —— 包管理器和构建工具, 智能地自动补全和类型检验的多编辑器支持, 以及自动格式化代码等等。


#### 官方文档

- [中文文档](https://www.rust-lang.org/zh-CN/)
- [英文文档](https://www.rust-lang.org/learn)

#### 安装rust-lang IDE

Jetbrains是一家开发IDE的公司,旗下有很多优秀的IDE,phpstorm、goland、webstore、pyCharm等,今天我们要用到的是Intellij,然后我们可以在他的插件管理器中下载rust的插件,安装完毕之后,我们可以重启IDE,创建rust应用程序。

如果需要研究阅读插件的源代码,跟进插件的特性,可以[在github上](https://intellij-rust.github.io/)讨论。

#### 关于rust-lang的环境配置

官方提供了很优秀的解决方案,[Install Rust](https://www.rust-lang.org/tools/install),不知道从什么时候开始,学习东西喜欢从它的官方文档先开始研究。
> It looks like you’re running macOS, Linux, or another Unix-like OS. To download Rustup and install Rust, run the following in your terminal, then follow the on-screen instructions.
官方提供的方法其实很简单,是一个自动化安装的shell脚本,curl下载shell脚本,一键部署安装环境,十分的简单方便。

```bash
curl https://sh.rustup.rs -sSf | sh
```

#### 阅读文档,从`Hello world`程序开始我们的rust

开始我们的rust`hello world`程序之旅,不得不提一下cargo,rust的包管理工具(Rust's package manager)。

##### 首先我们需要通过`cargo`创建一个rust的项目

在命令行执行`cargo new hello-world`,然后cargo管理器就为我们创建了一个hello-world的目录,这个目录如下:
```
.
├── Cargo.lock
├── Cargo.toml
└── src
└── main.rs
```

其实`cargo new`,会直接给我们自动生成一个hello world的程序,代码如下
```rust
fn main() {
println!("Hello, world!");
}
```
然后我们只需要执行如下脚本,cargo会帮我们自动生成可执行文件,并且执行输出结果。
```bash

cargo run
# Compiling hello-demo v0.1.0 (/Users/demo/project/hello-demo)
# Finished dev [unoptimized + debuginfo] target(s) in 0.78s
# Running `target/debug/hello-demo`
# Hello world
```

##### 使用Rustc编译.rs文件

```bash
Rustc src/main.rs
./main

# Hello world
```

### Rust HelloWorld程序分析

Rust可执行程序一定需要一个入口文件,和C/C++一样,需要一个`manin`函数,关键词`fn`表示函数,宏`println!`可以帮助我们打印输出。
为什么说长得像函数的`println!`是宏,如果你观察仔细的话,你会发现宏是在函数后面增加了一个感叹号`!`,这个标识标识它就是宏。
关于宏的介绍,后面我会弄个专栏来介绍它。宏不管是在C还是Rust中,都十分的强大。相信你也会喜欢这门语言的。