Skip to content

Commit

Permalink
Merge pull request #521 from wayslog/master
Browse files Browse the repository at this point in the history
修复大量来自gitbook的错误积累
  • Loading branch information
wayslog authored Jan 1, 2017
2 parents 82c8b1b + 870291f commit 9a0c898
Show file tree
Hide file tree
Showing 15 changed files with 65 additions and 64 deletions.
2 changes: 1 addition & 1 deletion SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@
* [评测 (benchmark)](testing/bench.md)
* [代码风格](coding-style/style.md)「tiansiyuan」
* [Any与反射](any/any.md)「wayslog」
* [安全(safe)](safe/safety.md)「daogangtang」
* [安全](safe/safety.md)「daogangtang」
* [常用数据结构实现](data-structure/preface.md)「Naupio」
* [栈结构](data-structure/stack.md)
* [队列](data-structure/queue.md)
Expand Down
16 changes: 8 additions & 8 deletions action/db/readme.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
# rust数据库操作

编程时,我们依赖数据库来存储相应的数据,很多编程语言都支持对数据库的操作(为什么不是全部,因为还有html这样的东西),所以当然
可以使用rust操作数据库。
编程时,我们依赖数据库来存储相应的数据,很多编程语言都支持对数据库的操作,所以当然可以使用Rust操作数据库。

不过在我自己操作时,发现很多问题,主要因为我不了解rust在操作数据库时,应该注意的事情,从而浪费了很多的时间,在进行数据查询时。
不过在我自己操作时,发现很多问题,主要因为我不了解Rust在操作数据库时,应该注意的事情,从而浪费了很多的时间,在进行数据查询时。
具体遇到的坑,我会做一些演示,从而让大家避免这些情况。

首先使用rust操作postgresql,因为postgresql是我最喜欢的数据库
首先使用Rust操作PostgreSQL,因为PostgreSQL是我最喜欢的数据库

首先创建新项目 `cargo new db --bin`

在cargo.toml中添加,postgres:
在cargo.toml中添加 `postgres` 如下:


``` rust
[package]
Expand Down Expand Up @@ -185,7 +185,7 @@ fn main() {
自己遇到的坑

- 创建连接函数时,连接必须有一个返回值,所以必须指定返回值的类型,
对于一个写python的人而言,我觉得是痛苦的,我想按照官方的写法match
对于一个写Python的人而言,我觉得是痛苦的,我想按照官方的写法match
一下,发现可能产生多个返回值。在编译时直接无法通过编译,所以最终
使用了unwrap,解决问题,不过我还是没有学会,函数多值返回时我如何
定义返回值
Expand Down Expand Up @@ -224,8 +224,8 @@ Could not compile `db`.

然后去查看了关于postgres模块的所有函数,尝试了无数种办法,依旧没有解决。

可能自己眼高手低,如果从头再把rust的相关教程看一下,可能很早就发现这个问题,
也有可能是因为习惯了写python,导致自己使用固有的思维来看待问题和钻牛角尖,才
可能自己眼高手低,如果从头再把Rust的相关教程看一下,可能很早就发现这个问题,
也有可能是因为习惯了写Python,导致自己使用固有的思维来看待问题和钻牛角尖,才
导致出现这样的问题,浪费很多的时间。

- 改变思维,把自己当作一个全新的新手,既要利用已有的思想来学习新的语言,同样不要
Expand Down
10 changes: 5 additions & 5 deletions action/json_data/readme.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# rust json处理
# Rust json处理

json是一种比较重要的格式,尤其是现在的web开发领域,json相比于传统的xml更加容易操作和减小传输
JSON是一种比较重要的格式,尤其是现在的web开发领域,JSON相比于传统的XML更加容易操作和减小传输

rust中的json处理依赖 cargo 中的rustc-serialize模块
Rust中的JSON处理依赖 cargo 中的rustc-serialize模块

###先简单的创建一个rust项目工程
###先简单的创建一个Rust项目工程

``` rust
$ cargo new json_data --bin
Expand Down Expand Up @@ -64,7 +64,7 @@ $ cargo build
*注意一个问题由于国内网络访问github不稳定,这些第三方库很多托管在github上,所以可能需要修改你的
网络访问*
1. 在安装rust之后,会在你的用户目录之下生成一个`.cargo`文件夹,进入这个文件夹
1. 在安装Rust之后,会在你的用户目录之下生成一个`.cargo`文件夹,进入这个文件夹
2. 在`.cargo`文件夹下,创建一个`config`文件,在文件中填写中科大软件源,可能以后会出现其他的源,先用这个
3. `config`文件内容如下
Expand Down
2 changes: 1 addition & 1 deletion ffi/compiling-rust-to-lib.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 将rust编译成库
# 将Rust编译成库
上一章讲述了如何从rust中调用c库,这一章我们讲如何把rust编译成库让别的语言通过cffi调用。

## 调用约定和mangle
Expand Down
4 changes: 2 additions & 2 deletions iterator/iterator.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ let m = (1..20).fold(1u64, |mul, x| mul*x);

### 适配器

我们所熟知的生产消费的模型里,生产者所生产的东西不一定都会被消费者买账,因此,需要对原有的产品进行再组装。这个再组装的过程,就是适配器。因为适配器返回的是一个新的迭代器,可以直接用链式请求一直写下去,而不至于陷入到某前端语言的回调地狱之中
我们所熟知的生产消费的模型里,生产者所生产的东西不一定都会被消费者买账,因此,需要对原有的产品进行再组装。这个再组装的过程,就是适配器。因为适配器返回的是一个新的迭代器,所以可以直接用链式请求一直写下去

前面提到了 Reduce 函数,那么自然不得不提一下另一个配套函数 —— `map` :

Expand All @@ -149,7 +149,7 @@ warning: unused result which must be used: iterator adaptors are lazy and

呀,这是啥?

因为,所有的适配器,都是惰性求值的!都是惰性求值的!都是惰性求值的!
因为,所有的适配器,都是惰性求值的!

**也就是说,除非你调用一个消费者,不然,你的操作,永远也不会被调用到!**

Expand Down
2 changes: 1 addition & 1 deletion module/module.md
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ use super::xxx;

路径中的 `*` 符号:
```rust
use xxx:*
use xxx::*;
```
表示导入 `xxx` 模块下的所有可见 item(加了 pub 标识的 item)。

Expand Down
2 changes: 1 addition & 1 deletion ownership-system/lifetime.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ fn main() {

> error: unresolved name `x`.
错误的意思是“无法解析 `a` 标识符”,也就是找不到 `x` , 这是因为像很多编程语言一样,Rust中也存在作用域概念,当资源离开离开作用域后,资源的内存就会被释放回收,当借用/引用离开作用域后也会被销毁,所以 `x` 在离开自己的作用域后,无法在作用域之外访问。
错误的意思是“无法解析 `x` 标识符”,也就是找不到 `x` , 这是因为像很多编程语言一样,Rust中也存在作用域概念,当资源离开离开作用域后,资源的内存就会被释放回收,当借用/引用离开作用域后也会被销毁,所以 `x` 在离开自己的作用域后,无法在作用域之外访问。


上面的涉及到几个概念:
Expand Down
4 changes: 2 additions & 2 deletions ownership-system/ownership.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,9 @@ c.rs:4 println!("{}", a);
在Rust中,和“绑定”概念相辅相成的另一个机制就是“转移move所有权”,意思是,**可以把资源的所有权(ownership)从一个绑定转移(move)成另一个绑定**,这个操作同样通过`let`关键字完成,和绑定不同的是,`=`两边的左值和右值均为两个标识符:
```rust
语法:
let 标识符A = 标识符B; // 把“A”绑定资源的所有权转移给“B
let 标识符A = 标识符B; // 把“B”绑定资源的所有权转移给“A
```
Move前后的内存示意如下
move前后的内存示意如下
> **Before move:**
a <=> 内存(地址:**A**,内容:"xyz")
**After move:**
Expand Down
4 changes: 2 additions & 2 deletions quickstart/control-flow.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,7 @@ match pair {
}
```

`match`的这种解构同样适用于结构体或者枚举。如果有必要,
还可以使用`..`来忽略域或者数据:
`match`的这种解构同样适用于结构体或者枚举。如果有必要,还可以使用`..`来忽略域或者数据:

```rust
struct Point {
Expand All @@ -141,6 +140,7 @@ enum OptionalInt {
let x = OptionalInt::Value(5);

match x {
// 这里是 match 的 if guard 表达式,我们将在以后的章节进行详细介绍
OptionalInt::Value(i) if i > 5 => println!("Got an int bigger than five!"),
OptionalInt::Value(..) => println!("Got an int!"),
OptionalInt::Missing => println!("No such luck."),
Expand Down
4 changes: 2 additions & 2 deletions quickstart/rust-travel.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ fn main() {
> [package]
name = "hellorust"
version = "0.1."
authors = ["YourName <YourEmail>"]
> [dependencies]
authors = ["YourName <YourEmail>"]
[dependencies]

- 编辑src目录下的main.rs文件

Expand Down
2 changes: 1 addition & 1 deletion quickstart/struct-enum.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ struct Point {
x: i32,
y: i32,
}
let mut point = Point { x: 0, y: 0 };
let point = Point { x: 0, y: 0 };

// tuple structs
struct Color(u8, u8, u8);
Expand Down
10 changes: 5 additions & 5 deletions testing/bench.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# 性能评测
# 性能测试

测试,是验证程序的正确性,这是第一步。程序能正常运行后,往往需要测试程序(一部分)的执行速度,这时,就需要用到性能评测
通常来讲,所谓性能评测,指的是测量程序运行的速度,即运行一次要多少时间(通常是执行多次求平均值)。Rust 竟然连这个特性都集成在语言基础特性中,真的是一门很重视工程性的语言。
测试,是验证程序的正确性,这是第一步。程序能正常运行后,往往需要测试程序(一部分)的执行速度,这时,就需要用到性能测试
通常来讲,所谓性能测试,指的是测量程序运行的速度,即运行一次要多少时间(通常是执行多次求平均值)。Rust 竟然连这个特性都集成在语言基础特性中,真的是一门很重视工程性的语言。

下面直接说明如何使用。

Expand Down Expand Up @@ -63,11 +63,11 @@ test tests::bench_add_two ... bench: 1 ns/iter (+/- 0)
test result: ok. 0 passed; 0 failed; 1 ignored; 1 measured
```

可以看到,Rust 的性能评测是以纳秒 ns 为单位。
可以看到,Rust 的性能测试是以纳秒 ns 为单位。

写测评代码的时候,需要注意以下一些点:

1. 只把你需要做性能评测的代码(函数)放在评测函数中;
1. 只把你需要做性能测试的代码(函数)放在评测函数中;
2. 对于参与做性能测试的代码(函数),要求每次测试做同样的事情,不要做累积和改变外部状态的操作;
3. 参数性能测试的代码(函数),执行时间不要太长。太长的话,最好分成几个部分测试。这也方便找出性能瓶颈所在地方。

Loading

0 comments on commit 9a0c898

Please sign in to comment.