From e67f6af823ad374f48451dd2acce51e90fac4778 Mon Sep 17 00:00:00 2001
From: naupio_zy_huang
Date: Wed, 6 Apr 2016 18:02:28 +0800
Subject: [PATCH 01/10] fix #160
---
12-ownership-system/12-01-ownership.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/12-ownership-system/12-01-ownership.md b/12-ownership-system/12-01-ownership.md
index 1855cd0..3b6922d 100644
--- a/12-ownership-system/12-01-ownership.md
+++ b/12-ownership-system/12-01-ownership.md
@@ -28,7 +28,7 @@ int* foo() {
上面定义了一个i32类型的标识符a,如果你直接println,你会收到一个error报错:
> error: use of possibly uninitialized variable: `a`
-这是**因为Rust并不会像其他语言一样可以为变量默认初始化值,Rust明确规定变量的初始值必须有程序员自己决定**。
+这是**因为Rust并不会像其他语言一样可以为变量默认初始化值,Rust明确规定变量的初始值必须由程序员自己决定**。
正确的做法:
```rust
From 49b9806c7d02f17aaa3c88733882e487c50b28e7 Mon Sep 17 00:00:00 2001
From: Naupio
Date: Thu, 7 Apr 2016 00:40:42 +0800
Subject: [PATCH 02/10] rewrite 04 chapter: add 04-00-rust-travel
---
.../04-00-rust-travel.md | 112 ++++++++++++++++++
1 file changed, 112 insertions(+)
create mode 100644 04-quickstart-rewrite-WIP/04-00-rust-travel.md
diff --git a/04-quickstart-rewrite-WIP/04-00-rust-travel.md b/04-quickstart-rewrite-WIP/04-00-rust-travel.md
new file mode 100644
index 0000000..25f700e
--- /dev/null
+++ b/04-quickstart-rewrite-WIP/04-00-rust-travel.md
@@ -0,0 +1,112 @@
+# Rust旅程
+
+## HelloWorld
+按照编程语言的传统,学习第一门编程语言的第一个程序都是打印 Hello World!
+下面根据我们的步骤创建 Rust 的 Hello World!程序:
+
+**下面的命令操作,如果没有特别说明,都是在shell下运行。本文为了简单统一,所有例子都在 win10 的 powershell 下运行,所有命令都运行在`ps:`标识符之后**
+
+- 创建一个 Doing 目录和 helloworld.rs 文件
+
+> ps: mkdir ~/Doing
+
+> ps: cd ~/Doing
+
+> ps: notepad helloworld.rs # 作者偏向于使用 sublime 作为编辑器
+
+> ps: subl helloworld.rs # 本章以后使用 subl 代替 notepad
+
+注意这里用的后缀名是.rs,一般编程语言的代码文件都有惯用的后缀名,比如:
+ C语言是.c,java是.java,python是.py等等,**请务必记住Rust语言的惯用后缀名是.rs**(虽然用别的后缀名也能通过rustc的编译)。
+
+- 在 helloworld.rs 文件中输入 Rust 代码
+
+```rust
+fn main() {
+ println!("Hello World!");
+}
+```
+
+- 编译 helloworld.rs 文件
+
+> ps: rustc helloworld.rs
+
+> ps: rustc helloworld.rs -O # 也可以选择优化编译
+
+- 运行程序
+
+> ps: ./helloworld.exe # windows 平台下需要加 .exe 后缀
+
+> Hello World!
+
+没有`ps:`前缀的表示为控制台打印输出。
+
+我们已经用rust编写第一个可执行程序,打印出了'hello world!',很酷,对吧!
+但是这段代码到底是什么意思呢,作为新手的你一定云里雾里吧,让我们先看一下这个程序:
+
+1. 第一行中 fn 表示定义一个**函数**,main是这个函数的名字,花括号{}里的语句则表示这个函数的内容。
+2. 名字叫做**main**的函数有特殊的用途,那就是作为程序的入口,也就是说程序每次都从这个函数开始运行。
+3. 函数中只有一句 ```println!("Hello World!");```,这里```println!```是一个Rust语言自带的**宏**,
+这个宏的功能就是打印文本(结尾会换行),而"Hello World!"这个用引号包起来的东西是一个**字符串**,就是我们要打印的文本。
+4. 你一定注意到了```;```吧, 在Rust语言中,分号```;```用来把语句分隔开,也就是说语句的末尾一般用分号做为结束标志。
+
+## HelloRust
+
+- 创建项目 hellorust
+
+> ps: cargo new hellorust --bin
+
+- 查看目录结构
+
+> ps: tree # win10 powershell 自带有 tree 查看文件目录结构的功能
+
+> └─hellorust
+
+> ----└─src
+
+这里显示的目录结构,在hellorust目录下有 src 文件夹和 Cargo.toml 文件,同时这个目录会初始化为 git 项目
+
+- 查看Cargo.toml文件
+
+> ps: cat Cargo.toml
+
+> [package]
+name = "hellorust"
+version = "0.1."
+authors = ["YourName "]
+
+> [dependencies]
+
+- 编辑src目录下的main.rs文件
+
+> ps: subl ./src/main.rs
+
+cargo 创建的项目,在src目录下会有一个初始化的main.rs文件,内容为:
+```rust
+fn main() {
+ println!("Hello, world!");
+}
+```
+现在我们编辑这个文件,改为:
+```rust
+fn main() {
+ let rust = "Rust";
+ println!("Hello, {}!", rust);
+}
+```
+这里的 `let rust = "Rust"` 是把 rust 变量绑定为 "Rust" ,
+`println!("Hello, {}!", rust);`里把 rust 变量的值代入到`"Hello, {}!"`中的`{}`。
+
+- 编译和运行
+
+> ps: cargo build
+
+> ps: cargo build --release # 这个属于优化编译
+
+> ps: ./target/debug/hellorust.exe
+
+> ps: ./target/release/hellorust.exe # 如果前面是优化编译,则这样运行
+
+> ps: cargo run # 编译和运行合在一起
+
+> ps: cargo run --release # 同上,区别是是优化编译的
\ No newline at end of file
From 4da4df545367c8384aa8c67249962cb4fcc066d0 Mon Sep 17 00:00:00 2001
From: naupio_zy_huang
Date: Fri, 8 Apr 2016 10:48:07 +0800
Subject: [PATCH 03/10] fix #163
---
12-ownership-system/12-01-ownership.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/12-ownership-system/12-01-ownership.md b/12-ownership-system/12-01-ownership.md
index 3b6922d..9651fc8 100644
--- a/12-ownership-system/12-01-ownership.md
+++ b/12-ownership-system/12-01-ownership.md
@@ -261,7 +261,8 @@ fn main() {
}
```
>结果: x=100, y=102
-
+
+注意: 例子1是比较特别的,使不使用 move 对结果都没什么影响,因为环境变量 x 是 i32 类型,属于 primitive type,实现了 Copy trait,在闭包使用 move 的时候,是先 clone 了一份 x ,在 move 的时候是 move 了这份 clone 的 x,所以后面的 println!引用 x 的时候没有报错。
**例子2:**
```rust
fn main() {
From 90e7d2bcc4bec84a2fa107f2bae337f5152bcd46 Mon Sep 17 00:00:00 2001
From: naupio_zy_huang
Date: Fri, 8 Apr 2016 10:52:28 +0800
Subject: [PATCH 04/10] update 12-01
---
12-ownership-system/12-01-ownership.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/12-ownership-system/12-01-ownership.md b/12-ownership-system/12-01-ownership.md
index 9651fc8..b78d9a7 100644
--- a/12-ownership-system/12-01-ownership.md
+++ b/12-ownership-system/12-01-ownership.md
@@ -263,6 +263,7 @@ fn main() {
>结果: x=100, y=102
注意: 例子1是比较特别的,使不使用 move 对结果都没什么影响,因为环境变量 x 是 i32 类型,属于 primitive type,实现了 Copy trait,在闭包使用 move 的时候,是先 clone 了一份 x ,在 move 的时候是 move 了这份 clone 的 x,所以后面的 println!引用 x 的时候没有报错。
+
**例子2:**
```rust
fn main() {
From f2ac2f6d7f549f0ee28c2826aafd9dfa721dffc4 Mon Sep 17 00:00:00 2001
From: Naupio
Date: Sun, 10 Apr 2016 14:24:32 +0800
Subject: [PATCH 05/10] add 04-01-primitive-type && update 04-00
---
.../04-00-rust-travel.md | 54 +-
.../04-01-primitive-type.html | 1085 +++++++++++++++++
.../04-01-primitive-type.md | 73 ++
SUMMARY.md | 12 +
4 files changed, 1190 insertions(+), 34 deletions(-)
create mode 100644 04-quickstart-rewrite-WIP/04-01-primitive-type.html
create mode 100644 04-quickstart-rewrite-WIP/04-01-primitive-type.md
diff --git a/04-quickstart-rewrite-WIP/04-00-rust-travel.md b/04-quickstart-rewrite-WIP/04-00-rust-travel.md
index 25f700e..fdbb252 100644
--- a/04-quickstart-rewrite-WIP/04-00-rust-travel.md
+++ b/04-quickstart-rewrite-WIP/04-00-rust-travel.md
@@ -8,13 +8,10 @@
- 创建一个 Doing 目录和 helloworld.rs 文件
-> ps: mkdir ~/Doing
-
-> ps: cd ~/Doing
-
-> ps: notepad helloworld.rs # 作者偏向于使用 sublime 作为编辑器
-
-> ps: subl helloworld.rs # 本章以后使用 subl 代替 notepad
+> ps: mkdir ~/Doing
+> ps: cd ~/Doing
+> ps: notepad helloworld.rs # 作者偏向于使用 sublime 作为编辑器
+> ps: subl helloworld.rs # 本章以后使用 subl 代替 notepad
注意这里用的后缀名是.rs,一般编程语言的代码文件都有惯用的后缀名,比如:
C语言是.c,java是.java,python是.py等等,**请务必记住Rust语言的惯用后缀名是.rs**(虽然用别的后缀名也能通过rustc的编译)。
@@ -29,15 +26,13 @@ fn main() {
- 编译 helloworld.rs 文件
-> ps: rustc helloworld.rs
-
-> ps: rustc helloworld.rs -O # 也可以选择优化编译
+> ps: rustc helloworld.rs
+> ps: rustc helloworld.rs -O # 也可以选择优化编译
- 运行程序
-> ps: ./helloworld.exe # windows 平台下需要加 .exe 后缀
-
-> Hello World!
+> ps: ./helloworld.exe # windows 平台下需要加 .exe 后缀
+> Hello World!
没有`ps:`前缀的表示为控制台打印输出。
@@ -54,27 +49,23 @@ fn main() {
- 创建项目 hellorust
-> ps: cargo new hellorust --bin
+> ps: cargo new hellorust --bin
- 查看目录结构
-> ps: tree # win10 powershell 自带有 tree 查看文件目录结构的功能
-
-> └─hellorust
-
-> ----└─src
+> ps: tree # win10 powershell 自带有 tree 查看文件目录结构的功能
+> └─hellorust
+> ----└─src
这里显示的目录结构,在hellorust目录下有 src 文件夹和 Cargo.toml 文件,同时这个目录会初始化为 git 项目
- 查看Cargo.toml文件
-> ps: cat Cargo.toml
-
+> ps: cat Cargo.toml
> [package]
name = "hellorust"
version = "0.1."
-authors = ["YourName "]
-
+authors = ["YourName "]
> [dependencies]
- 编辑src目录下的main.rs文件
@@ -99,14 +90,9 @@ fn main() {
- 编译和运行
-> ps: cargo build
-
-> ps: cargo build --release # 这个属于优化编译
-
-> ps: ./target/debug/hellorust.exe
-
-> ps: ./target/release/hellorust.exe # 如果前面是优化编译,则这样运行
-
-> ps: cargo run # 编译和运行合在一起
-
-> ps: cargo run --release # 同上,区别是是优化编译的
\ No newline at end of file
+> ps: cargo build
+> ps: cargo build --release # 这个属于优化编译
+> ps: ./target/debug/hellorust.exe
+> ps: ./target/release/hellorust.exe # 如果前面是优化编译,则这样运行
+> ps: cargo run # 编译和运行合在一起
+> ps: cargo run --release # 同上,区别是是优化编译的
\ No newline at end of file
diff --git a/04-quickstart-rewrite-WIP/04-01-primitive-type.html b/04-quickstart-rewrite-WIP/04-01-primitive-type.html
new file mode 100644
index 0000000..fef7170
--- /dev/null
+++ b/04-quickstart-rewrite-WIP/04-01-primitive-type.html
@@ -0,0 +1,1085 @@
+04-01-primitive-type基本类型
+变量绑定
+Rust 通过 let 关键字进行变量绑定。
+
fn main() {
+ let a1 = 5;
+ let a2:i32 = 5;
+ assert_eq!(a1, a2);
+ //let 绑定 整数变量默认类型推断是 i32
+
+ let b1:u32 = 5;
+ //assert_eq!(a1, b1);
+ //去掉上面的注释会报错,因为类型不匹配
+ //errer: mismatched types
+}
+
+这里的 assert_eq! 宏的作用是判断两个参数是不是相等的,但如果是两个不匹配的类型,就算字面值相等也会报错。
+可变绑定
+rust 在声明变量时,在变量前面加入 mut 关键字,变量就会成为可变绑定的变量。
+
fn main() {
+ let mut a: f64 = 1.0;
+ let b = 2.0f32;
+
+ //改变 a 的绑定
+ a = 2.0;
+ println!("{:?}", a);
+
+ //重新绑定为不可变
+ let a = a;
+
+ //不能赋值
+ //a = 3.0;
+
+ //类型不匹配
+ //assert_eq!(a, b);
+}
+
+这里的 b 变量,绑定了 2.0f32。这是 Rust 里面值类型显式标记的语发。语法规定为value+tpye的形式。
+例如:
+固定大小类型:
+
+1u8 1i8
+1u16 1i16
+1u32 1i32
+1u64 1i64
+
+可变大小类型:
+
+1usize 1isize
+
+浮点类型:
+
+1f32 1f64
+
+let解构
+为什么在 Rust 里面生命一个变量的时候要采用 let 绑定语法?
+那是因为 let 绑定语法的表达能力更强,而且 let 语言其实是一种模式。
+例如:
+
fn main() {
+ let (a, mut b): (bool,bool) = (true, false);
+ println!("a = {:?}, b = {:?}", a, b);
+ //a 不可变绑定
+ //a = false;
+
+ //b 可变绑定
+ b = true;
+ assert_eq!(a, b);
+}
+
+这里使用了 bool 类型,bool 类型只有 true 和 false 两个值。通常用来做逻辑判断。
\ No newline at end of file
diff --git a/04-quickstart-rewrite-WIP/04-01-primitive-type.md b/04-quickstart-rewrite-WIP/04-01-primitive-type.md
new file mode 100644
index 0000000..1b2752a
--- /dev/null
+++ b/04-quickstart-rewrite-WIP/04-01-primitive-type.md
@@ -0,0 +1,73 @@
+# 基本类型
+
+## 变量绑定
+Rust 通过 let 关键字进行变量绑定。
+```rust
+fn main() {
+ let a1 = 5;
+ let a2:i32 = 5;
+ assert_eq!(a1, a2);
+ //let 绑定 整数变量默认类型推断是 i32
+
+ let b1:u32 = 5;
+ //assert_eq!(a1, b1);
+ //去掉上面的注释会报错,因为类型不匹配
+ //errer: mismatched types
+}
+```
+这里的 assert_eq! 宏的作用是判断两个参数是不是相等的,但如果是两个不匹配的类型,就算字面值相等也会报错。
+
+## 可变绑定
+rust 在声明变量时,在变量前面加入 mut 关键字,变量就会成为可变绑定的变量。
+```rust
+fn main() {
+ let mut a: f64 = 1.0;
+ let b = 2.0f32;
+
+ //改变 a 的绑定
+ a = 2.0;
+ println!("{:?}", a);
+
+ //重新绑定为不可变
+ let a = a;
+
+ //不能赋值
+ //a = 3.0;
+
+ //类型不匹配
+ //assert_eq!(a, b);
+}
+```
+这里的 b 变量,绑定了 2.0f32。这是 Rust 里面值类型显式标记的语发。语法规定为`value`+`tpye`的形式。
+
+**例如:**
+固定大小类型:
+> 1u8 1i8
+> 1u16 1i16
+> 1u32 1i32
+> 1u64 1i64
+
+可变大小类型:
+> 1usize 1isize
+
+浮点类型:
+> 1f32 1f64
+
+## let解构
+为什么在 Rust 里面生命一个变量的时候要采用 let 绑定语法?
+那是因为 let 绑定语法的表达能力更强,而且 let 语言其实是一种模式。
+
+**例如:**
+```rust
+fn main() {
+ let (a, mut b): (bool,bool) = (true, false);
+ println!("a = {:?}, b = {:?}", a, b);
+ //a 不可变绑定
+ //a = false;
+
+ //b 可变绑定
+ b = true;
+ assert_eq!(a, b);
+}
+```
+这里使用了 bool 类型,bool 类型只有 true 和 false 两个值。通常用来做逻辑判断。
\ No newline at end of file
diff --git a/SUMMARY.md b/SUMMARY.md
index 015af7d..186ade9 100644
--- a/SUMMARY.md
+++ b/SUMMARY.md
@@ -19,6 +19,18 @@
* [第一个Rust程序](./04-quickstart/04-01-hello-world.md)
* [简单的数学运算](./04-quickstart/04-02-basic-math.md)
* [快速上手](./04-quickstart/04-03-cheet-sheet.md)
+* [Rust快速入门WIP](./04-quickstart-rewrite-WIP)「Naupio重写中」
+ * [Rust旅程](./04-quickstart-rewrite-WIP/04-00-rust-travel.md)
+ * [基本类型](./04-quickstart-rewrite-WIP/04-01-primitive-type.md)
+ * [输入输出]
+ * [操作流]
+ * [文档和注释]
+ * [字符串和数组]
+ * [结构体和枚举]
+ * [模式匹配]
+ * [函数和方法]
+ * [类型和特性]
+ * [模块和包箱]
* [Cargo项目管理器](./05-cargo-projects-manager/05-cargo-projects-manager.md)「fuyingfuying」
* [基本程序结构](./06-flow/06-00-preface.md)「daogangtang」
* [注释](./06-flow/06-01-comment.md)
From 1697690e7af39358263d470fe04bfb9c96b14aad Mon Sep 17 00:00:00 2001
From: Naupio
Date: Sun, 10 Apr 2016 14:25:20 +0800
Subject: [PATCH 06/10] add 04-01-primitive-type && update 04-00
---
.../04-01-primitive-type.html | 1085 -----------------
1 file changed, 1085 deletions(-)
delete mode 100644 04-quickstart-rewrite-WIP/04-01-primitive-type.html
diff --git a/04-quickstart-rewrite-WIP/04-01-primitive-type.html b/04-quickstart-rewrite-WIP/04-01-primitive-type.html
deleted file mode 100644
index fef7170..0000000
--- a/04-quickstart-rewrite-WIP/04-01-primitive-type.html
+++ /dev/null
@@ -1,1085 +0,0 @@
-04-01-primitive-type基本类型
-变量绑定
-Rust 通过 let 关键字进行变量绑定。
-
fn main() {
- let a1 = 5;
- let a2:i32 = 5;
- assert_eq!(a1, a2);
- //let 绑定 整数变量默认类型推断是 i32
-
- let b1:u32 = 5;
- //assert_eq!(a1, b1);
- //去掉上面的注释会报错,因为类型不匹配
- //errer: mismatched types
-}
-
-这里的 assert_eq! 宏的作用是判断两个参数是不是相等的,但如果是两个不匹配的类型,就算字面值相等也会报错。
-可变绑定
-rust 在声明变量时,在变量前面加入 mut 关键字,变量就会成为可变绑定的变量。
-
fn main() {
- let mut a: f64 = 1.0;
- let b = 2.0f32;
-
- //改变 a 的绑定
- a = 2.0;
- println!("{:?}", a);
-
- //重新绑定为不可变
- let a = a;
-
- //不能赋值
- //a = 3.0;
-
- //类型不匹配
- //assert_eq!(a, b);
-}
-
-这里的 b 变量,绑定了 2.0f32。这是 Rust 里面值类型显式标记的语发。语法规定为value+tpye的形式。
-例如:
-固定大小类型:
-
-1u8 1i8
-1u16 1i16
-1u32 1i32
-1u64 1i64
-
-可变大小类型:
-
-1usize 1isize
-
-浮点类型:
-
-1f32 1f64
-
-let解构
-为什么在 Rust 里面生命一个变量的时候要采用 let 绑定语法?
-那是因为 let 绑定语法的表达能力更强,而且 let 语言其实是一种模式。
-例如:
-
fn main() {
- let (a, mut b): (bool,bool) = (true, false);
- println!("a = {:?}, b = {:?}", a, b);
- //a 不可变绑定
- //a = false;
-
- //b 可变绑定
- b = true;
- assert_eq!(a, b);
-}
-
-这里使用了 bool 类型,bool 类型只有 true 和 false 两个值。通常用来做逻辑判断。
\ No newline at end of file
From 2de0b0a30bc2718944edd49c1a93a5bc69987a35 Mon Sep 17 00:00:00 2001
From: Naupio
Date: Sun, 10 Apr 2016 14:27:38 +0800
Subject: [PATCH 07/10] add 04-01-primitive-type && update 04-00
---
04-quickstart-rewrite-WIP/04-00-rust-travel.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/04-quickstart-rewrite-WIP/04-00-rust-travel.md b/04-quickstart-rewrite-WIP/04-00-rust-travel.md
index fdbb252..97c52c0 100644
--- a/04-quickstart-rewrite-WIP/04-00-rust-travel.md
+++ b/04-quickstart-rewrite-WIP/04-00-rust-travel.md
@@ -62,9 +62,9 @@ fn main() {
- 查看Cargo.toml文件
> ps: cat Cargo.toml
-> [package]
-name = "hellorust"
-version = "0.1."
+> [package]
+name = "hellorust"
+version = "0.1."
authors = ["YourName "]
> [dependencies]
From a20f1b8c706b8f9e7882c09a7268c0b702e1310e Mon Sep 17 00:00:00 2001
From: Naupio
Date: Sun, 10 Apr 2016 14:38:37 +0800
Subject: [PATCH 08/10] update readme
---
...-00-rust-travel.md => 04-01-rust-travel.md} | 0
...imitive-type.md => 04-02-primitive-type.md} | 0
README.md | 12 ++++++++++++
SUMMARY.md | 18 +++++++++---------
4 files changed, 21 insertions(+), 9 deletions(-)
rename 04-quickstart-rewrite-WIP/{04-00-rust-travel.md => 04-01-rust-travel.md} (100%)
rename 04-quickstart-rewrite-WIP/{04-01-primitive-type.md => 04-02-primitive-type.md} (100%)
diff --git a/04-quickstart-rewrite-WIP/04-00-rust-travel.md b/04-quickstart-rewrite-WIP/04-01-rust-travel.md
similarity index 100%
rename from 04-quickstart-rewrite-WIP/04-00-rust-travel.md
rename to 04-quickstart-rewrite-WIP/04-01-rust-travel.md
diff --git a/04-quickstart-rewrite-WIP/04-01-primitive-type.md b/04-quickstart-rewrite-WIP/04-02-primitive-type.md
similarity index 100%
rename from 04-quickstart-rewrite-WIP/04-01-primitive-type.md
rename to 04-quickstart-rewrite-WIP/04-02-primitive-type.md
diff --git a/README.md b/README.md
index ed3caaf..8458f1a 100644
--- a/README.md
+++ b/README.md
@@ -33,6 +33,18 @@ https://wayslog.gitbooks.io/rustprimer/content/
1. [第一个Rust程序](./04-quickstart/04-01-hello-world.md)
2. [简单的数学运算](./04-quickstart/04-02-basic-math.md)
3. [快速上手](./04-quickstart/04-03-cheet-sheet.md)
+4. [Rust快速入门WIP](./04-quickstart-rewrite-WIP)「Naupio重写中」
+ 1. [Rust旅程](./04-quickstart-rewrite-WIP/04-01-rust-travel.md)
+ 2. [基本类型](./04-quickstart-rewrite-WIP/04-02-primitive-type.md)
+ 3. [TODO输入输出]
+ 4. [TODO操作流]
+ 5. [TODO文档和注释]
+ 6. [TODO字符串和数组]
+ 7. [TODO结构体和枚举]
+ 8. [TODO模式匹配]
+ 9. [TODO函数和方法]
+ 10. [TODO类型和特性]
+ 11. [TODO模块和包箱]
5. [Cargo项目管理器](./05-cargo-projects-manager/05-cargo-projects-manager.md)「fuyingfuying」
6. [基本程序结构](./06-flow/06-00-preface.md)「daogangtang」
1. [注释](./06-flow/06-01-comment.md)
diff --git a/SUMMARY.md b/SUMMARY.md
index 186ade9..47acf0d 100644
--- a/SUMMARY.md
+++ b/SUMMARY.md
@@ -22,15 +22,15 @@
* [Rust快速入门WIP](./04-quickstart-rewrite-WIP)「Naupio重写中」
* [Rust旅程](./04-quickstart-rewrite-WIP/04-00-rust-travel.md)
* [基本类型](./04-quickstart-rewrite-WIP/04-01-primitive-type.md)
- * [输入输出]
- * [操作流]
- * [文档和注释]
- * [字符串和数组]
- * [结构体和枚举]
- * [模式匹配]
- * [函数和方法]
- * [类型和特性]
- * [模块和包箱]
+ * [TODO输入输出]
+ * [TODO操作流]
+ * [TODO文档和注释]
+ * [TODO字符串和数组]
+ * [TODO结构体和枚举]
+ * [TODO模式匹配]
+ * [TODO函数和方法]
+ * [TODO类型和特性]
+ * [TODO模块和包箱]
* [Cargo项目管理器](./05-cargo-projects-manager/05-cargo-projects-manager.md)「fuyingfuying」
* [基本程序结构](./06-flow/06-00-preface.md)「daogangtang」
* [注释](./06-flow/06-01-comment.md)
From c73563035de96f7a6c9ddfb3faee2429d4214742 Mon Sep 17 00:00:00 2001
From: Naupio
Date: Sun, 10 Apr 2016 14:44:20 +0800
Subject: [PATCH 09/10] update readme
---
README.md | 14 +-------------
SUMMARY.md | 12 ------------
2 files changed, 1 insertion(+), 25 deletions(-)
diff --git a/README.md b/README.md
index 8458f1a..ae73df9 100644
--- a/README.md
+++ b/README.md
@@ -32,19 +32,7 @@ https://wayslog.gitbooks.io/rustprimer/content/
4. [Rust一小时快速入门](./04-quickstart/04-00-intro.md)「ee0703」
1. [第一个Rust程序](./04-quickstart/04-01-hello-world.md)
2. [简单的数学运算](./04-quickstart/04-02-basic-math.md)
- 3. [快速上手](./04-quickstart/04-03-cheet-sheet.md)
-4. [Rust快速入门WIP](./04-quickstart-rewrite-WIP)「Naupio重写中」
- 1. [Rust旅程](./04-quickstart-rewrite-WIP/04-01-rust-travel.md)
- 2. [基本类型](./04-quickstart-rewrite-WIP/04-02-primitive-type.md)
- 3. [TODO输入输出]
- 4. [TODO操作流]
- 5. [TODO文档和注释]
- 6. [TODO字符串和数组]
- 7. [TODO结构体和枚举]
- 8. [TODO模式匹配]
- 9. [TODO函数和方法]
- 10. [TODO类型和特性]
- 11. [TODO模块和包箱]
+ 3. [快速上手](./04-quickstart/04-03-cheet-sheet.md)
5. [Cargo项目管理器](./05-cargo-projects-manager/05-cargo-projects-manager.md)「fuyingfuying」
6. [基本程序结构](./06-flow/06-00-preface.md)「daogangtang」
1. [注释](./06-flow/06-01-comment.md)
diff --git a/SUMMARY.md b/SUMMARY.md
index 47acf0d..015af7d 100644
--- a/SUMMARY.md
+++ b/SUMMARY.md
@@ -19,18 +19,6 @@
* [第一个Rust程序](./04-quickstart/04-01-hello-world.md)
* [简单的数学运算](./04-quickstart/04-02-basic-math.md)
* [快速上手](./04-quickstart/04-03-cheet-sheet.md)
-* [Rust快速入门WIP](./04-quickstart-rewrite-WIP)「Naupio重写中」
- * [Rust旅程](./04-quickstart-rewrite-WIP/04-00-rust-travel.md)
- * [基本类型](./04-quickstart-rewrite-WIP/04-01-primitive-type.md)
- * [TODO输入输出]
- * [TODO操作流]
- * [TODO文档和注释]
- * [TODO字符串和数组]
- * [TODO结构体和枚举]
- * [TODO模式匹配]
- * [TODO函数和方法]
- * [TODO类型和特性]
- * [TODO模块和包箱]
* [Cargo项目管理器](./05-cargo-projects-manager/05-cargo-projects-manager.md)「fuyingfuying」
* [基本程序结构](./06-flow/06-00-preface.md)「daogangtang」
* [注释](./06-flow/06-01-comment.md)
From 9410343ee1324b29942541d3d7f16ba52fad19c4 Mon Sep 17 00:00:00 2001
From: Naupio
Date: Wed, 13 Apr 2016 00:50:44 +0800
Subject: [PATCH 10/10] add 04-02-primitive-type
---
.../04-02-primitive-type.md | 83 +++++++++++++++++++
1 file changed, 83 insertions(+)
diff --git a/04-quickstart-rewrite-WIP/04-02-primitive-type.md b/04-quickstart-rewrite-WIP/04-02-primitive-type.md
index 0ea8d8e..006487a 100644
--- a/04-quickstart-rewrite-WIP/04-02-primitive-type.md
+++ b/04-quickstart-rewrite-WIP/04-02-primitive-type.md
@@ -71,3 +71,86 @@ fn main() {
}
```
这里使用了 bool,只有true和false两个值,通常用来做逻辑判断的类型。
+
+## 原生类型
+
+Rust内置的原生类型 (primitive types) 有以下几类:
+
+* 布尔类型:有两个值`true`和`false`。
+* 字符类型:表示单个Unicode字符,存储为4个字节。
+* 数值类型:分为有符号整数 (`i8`, `i16`, `i32`, `i64`, `isize`)、
+无符号整数 (`u8`, `u16`, `u32`, `u64`, `usize`) 以及浮点数 (`f32`, `f64`)。
+* 字符串类型:最底层的是不定长类型`str`,更常用的是字符串切片`&str`和堆分配字符串`String`,
+其中字符串切片是静态分配的,有固定的大小,并且不可变,而堆分配字符串是可变的。
+* 数组:具有固定大小,并且元素都是同种类型,可表示为`[T; N]`。
+* 切片:引用一个数组的部分数据并且不需要拷贝,可表示为`&[T]`。
+* 元组:具有固定大小的有序列表,每个元素都有自己的类型,通过解构或者索引来获得每个元素的值。
+* 指针:最底层的是裸指针`*const T`和`*mut T`,但解引用它们是不安全的,必须放到`unsafe`块里。
+* 函数:具有函数类型的变量实质上是一个函数指针。
+* 元类型:即`()`,其唯一的值也是`()`。
+
+```rust
+// boolean type
+let t = true;
+let f: bool = false;
+
+// char type
+let c = 'c';
+
+// numeric types
+let x = 42;
+let y: u32 = 123_456;
+let z: f64 = 1.23e+2;
+let zero = z.abs_sub(123.4);
+let bin = 0b1111_0000;
+let oct = 0o7320_1546;
+let hex = 0xf23a_b049;
+
+// string types
+let str = "Hello, world!";
+let mut string = str.to_string();
+
+// arrays and slices
+let a = [0, 1, 2, 3, 4];
+let middle = &a[1..4];
+let mut ten_zeros: [i64; 10] = [0; 10];
+
+// tuples
+let tuple: (i32, &str) = (50, "hello");
+let (fifty, _) = tuple;
+let hello = tuple.1;
+
+// raw pointers
+let x = 5;
+let raw = &x as *const i32;
+let points_at = unsafe { *raw };
+
+// functions
+fn foo(x: i32) -> i32 { x }
+let bar: fn(i32) -> i32 = foo;
+```
+
+有几点是需要特别注意的:
+
+* 数值类型可以使用`_`分隔符来增加可读性。
+* Rust还支持单字节字符`b'H'`以及单字节字符串`b"Hello"`,仅限制于ASCII字符。
+此外,还可以使用`r#"..."#`标记来表示原始字符串,不需要对特殊字符进行转义。
+* 使用`&`符号将`String`类型转换成`&str`类型很廉价,
+但是使用`to_string()`方法将`&str`转换到`String`类型涉及到分配内存,
+除非很有必要否则不要这么做。
+* 数组的长度是不可变的,动态的数组称为向量 (vector),可以使用宏`vec!`创建。
+* 元组可以使用`==`和`!=`运算符来判断是否相同。
+* 不多于32个元素的数组和不多于12个元素的元组在值传递时是自动复制的。
+* Rust不提供原生类型之间的隐式转换,只能使用`as`关键字显式转换。
+* 可以使用`type`关键字定义某个类型的别名,并且应该采用驼峰命名法。
+
+```rust
+// explicit conversion
+let decimal = 65.4321_f32;
+let integer = decimal as u8;
+let character = integer as char;
+
+// type aliases
+type NanoSecond = u64;
+type Point = (u8, u8);
+```