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); +```