Skip to content

Commit

Permalink
Merge pull request rustcc#113 from zhongke/patch-2
Browse files Browse the repository at this point in the history
修改了四个地方,都是typo
  • Loading branch information
miketang84 committed Apr 1, 2016
2 parents fc77753 + 558fbc8 commit f52e920
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions 12-ownership-system/12-01-ownership.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
**所有权(Owership)**
-------------
在进入正题之前,大家先回忆下一般的编程语言知识。
对于一般的编程语言,通常会先声明一个变量,然后并初始化它
对于一般的编程语言,通常会先声明一个变量,然后初始化它
例如在C语言中:
```c
int* foo {
Expand Down Expand Up @@ -110,7 +110,7 @@ move前后的a和b对应内存的地址不同。
在Rust中,基本数据类型(Primitive Types)均实现了Copy特性,包括i8, i16, i32, i64, usize, u8, u16, u32, u64, f32, f64, (), bool, char等等。其他支持Copy的数据类型可以参考官方文档的[Copy章节](https://doc.rust-lang.org/std/marker/trait.Copy.html "Copy Trait")

### **浅拷贝与深拷贝**
对于上面move String和i32的两个例子的区别,其实很多面向对象编程语言中“浅拷贝”和“深拷贝”的区别。对于基本数据类型磊说,“深拷贝”和“浅拷贝“产生的效果相同。对于引用对象类型来说,”浅拷贝“更像仅仅拷贝了对象的内存地址。
对于上面move String和i32的两个例子的区别,其实很多面向对象编程语言中“浅拷贝”和“深拷贝”的区别。对于基本数据类型来说,“深拷贝”和“浅拷贝“产生的效果相同。对于引用对象类型来说,”浅拷贝“更像仅仅拷贝了对象的内存地址。
如果我们想实现对**String**的”深拷贝“怎么办? 可以直接调用**String**的Clone特性实现对内存的值拷贝而不是简单的地址拷贝。
```rust
{
Expand Down Expand Up @@ -180,7 +180,7 @@ pub trait Copy: Clone { }
一旦一种类型实现了Copy特性,这就意味着这种类型可以通过的简单的位(bits)拷贝实现拷贝。从前面知识我们知道“绑定”存在move语义(所有权转移),但是,一旦这种类型实现了Copy特性,会先拷贝内容到新内存区域,然后把新内存区域和这个标识符做绑定。

**哪些情况下我们自定义的类型(如某个Struct等)可以实现Copy特性?**
只要这种类型是属性类型都实现了Copy特性,那么这个类型就可以实现Copy特性。
只要这种类型的属性类型都实现了Copy特性,那么这个类型就可以实现Copy特性。
例如:
```rust
struct Foo { //可实现Copy特性
Expand Down Expand Up @@ -231,7 +231,7 @@ fn main() {
}
```
从结果我们发现let mut y = x后,x并没有因为所有权move而出现不可访问错误。
因为Copy特性继承了Clone特性,所以我们均需要手动实现这两个特性。
因为Foo继承了Copy特性和Clone特性,所以我们均需要手动实现这两个特性。


### **高级move**
Expand Down

0 comments on commit f52e920

Please sign in to comment.