Rollup merge of #25221 - michal-czardybon:master, r=steveklabnik
I corrected some pretty obvious textual mistakes. One thing requires more attention - the paragraph at line 133 in Ownership. It was confusing, so I changed it, but I am no sure if this is what the author had in mind.
This commit is contained in:
commit
e91d272fbb
3 changed files with 16 additions and 16 deletions
|
@ -5,7 +5,7 @@ Rust’s most unique and compelling features, with which Rust developers should
|
||||||
become quite acquainted. Ownership is how Rust achieves its largest goal,
|
become quite acquainted. Ownership is how Rust achieves its largest goal,
|
||||||
memory safety. There are a few distinct concepts, each with its own chapter:
|
memory safety. There are a few distinct concepts, each with its own chapter:
|
||||||
|
|
||||||
* [ownership][ownership], ownership, the key concept
|
* [ownership][ownership], the key concept
|
||||||
* [borrowing][borrowing], and their associated feature ‘references’
|
* [borrowing][borrowing], and their associated feature ‘references’
|
||||||
* lifetimes, which you’re reading now
|
* lifetimes, which you’re reading now
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ become quite acquainted. Ownership is how Rust achieves its largest goal,
|
||||||
memory safety. There are a few distinct concepts, each with its own
|
memory safety. There are a few distinct concepts, each with its own
|
||||||
chapter:
|
chapter:
|
||||||
|
|
||||||
* ownership, which you’re reading now.
|
* ownership, which you’re reading now
|
||||||
* [borrowing][borrowing], and their associated feature ‘references’
|
* [borrowing][borrowing], and their associated feature ‘references’
|
||||||
* [lifetimes][lifetimes], an advanced concept of borrowing
|
* [lifetimes][lifetimes], an advanced concept of borrowing
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ Before we get to the details, two important notes about the ownership system.
|
||||||
Rust has a focus on safety and speed. It accomplishes these goals through many
|
Rust has a focus on safety and speed. It accomplishes these goals through many
|
||||||
‘zero-cost abstractions’, which means that in Rust, abstractions cost as little
|
‘zero-cost abstractions’, which means that in Rust, abstractions cost as little
|
||||||
as possible in order to make them work. The ownership system is a prime example
|
as possible in order to make them work. The ownership system is a prime example
|
||||||
of a zero cost abstraction. All of the analysis we’ll talk about in this guide
|
of a zero-cost abstraction. All of the analysis we’ll talk about in this guide
|
||||||
is _done at compile time_. You do not pay any run-time cost for any of these
|
is _done at compile time_. You do not pay any run-time cost for any of these
|
||||||
features.
|
features.
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ With that in mind, let’s learn about ownership.
|
||||||
|
|
||||||
# Ownership
|
# Ownership
|
||||||
|
|
||||||
[`Variable bindings`][bindings] have a property in Rust: they ‘have ownership’
|
[Variable bindings][bindings] have a property in Rust: they ‘have ownership’
|
||||||
of what they’re bound to. This means that when a binding goes out of scope, the
|
of what they’re bound to. This means that when a binding goes out of scope, the
|
||||||
resource that they’re bound to are freed. For example:
|
resource that they’re bound to are freed. For example:
|
||||||
|
|
||||||
|
@ -106,8 +106,8 @@ take(v);
|
||||||
println!("v[0] is: {}", v[0]);
|
println!("v[0] is: {}", v[0]);
|
||||||
```
|
```
|
||||||
|
|
||||||
Same error: “use of moved value.” When we transfer ownership to something else,
|
Same error: ‘use of moved value’. When we transfer ownership to something else,
|
||||||
we say that we’ve ‘moved’ the thing we refer to. You don’t need some sort of
|
we say that we’ve ‘moved’ the thing we refer to. You don’t need any sort of
|
||||||
special annotation here, it’s the default thing that Rust does.
|
special annotation here, it’s the default thing that Rust does.
|
||||||
|
|
||||||
## The details
|
## The details
|
||||||
|
@ -121,19 +121,19 @@ let v = vec![1, 2, 3];
|
||||||
let v2 = v;
|
let v2 = v;
|
||||||
```
|
```
|
||||||
|
|
||||||
The first line creates some data for the vector on the [stack][sh], `v`. The
|
The first line allocates memory for the vector object, `v`, and for the data it
|
||||||
vector’s data, however, is stored on the [heap][sh], and so it contains a
|
contains. The vector object is stored on the [stack][sh] and contains a pointer
|
||||||
pointer to that data. When we move `v` to `v2`, it creates a copy of that pointer,
|
to the content (`[1, 2, 3]`) stored on the [heap][sh]. When we move `v` to `v2`,
|
||||||
for `v2`. Which would mean two pointers to the contents of the vector on the
|
it creates a copy of that pointer, for `v2`. Which means that there would be two
|
||||||
heap. That would be a problem: it would violate Rust’s safety guarantees by
|
pointers to the content of the vector on the heap. It would violate Rust’s
|
||||||
introducing a data race. Therefore, Rust forbids using `v` after we’ve done the
|
safety guarantees by introducing a data race. Therefore, Rust forbids using `v`
|
||||||
move.
|
after we’ve done the move.
|
||||||
|
|
||||||
[sh]: the-stack-and-the-heap.html
|
[sh]: the-stack-and-the-heap.html
|
||||||
|
|
||||||
It’s also important to note that optimizations may remove the actual copy of
|
It’s also important to note that optimizations may remove the actual copy of
|
||||||
the bytes, depending on circumstances. So it may not be as inefficient as it
|
the bytes on the stack, depending on circumstances. So it may not be as
|
||||||
initially seems.
|
inefficient as it initially seems.
|
||||||
|
|
||||||
## `Copy` types
|
## `Copy` types
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
% while loops
|
% while Loops
|
||||||
|
|
||||||
Rust also has a `while` loop. It looks like this:
|
Rust also has a `while` loop. It looks like this:
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue