Skip to content

Commit 79ee0df

Browse files
committed
---
yaml --- r: 206783 b: refs/heads/beta c: 3981481 h: refs/heads/master i: 206781: 6942293 206779: c66f0d0 206775: 4a36ead 206767: 6b1ddc1 206751: 41a2e75 206719: 40baf0d v: v3
1 parent 55797ba commit 79ee0df

File tree

31 files changed

+665
-398
lines changed

31 files changed

+665
-398
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ refs/tags/0.12.0: f0c419429ef30723ceaf6b42f9b5a2aeb5d2e2d1
2929
refs/heads/automation-fail: 1bf06495443584539b958873e04cc2f864ab10e4
3030
refs/heads/batch: b7fd822592a4fb577552d93010c4a4e14f314346
3131
refs/heads/building: 126db549b038c84269a1e4fe46f051b2c15d6970
32-
refs/heads/beta: 6faa8d6793e9136cbc2d852504f499144ddd1097
32+
refs/heads/beta: 398148193b1a536098292a5dcc9832a88d8db764
3333
refs/heads/windistfix: 7608dbad651f02e837ed05eef3d74a6662a6e928
3434
refs/tags/1.0.0-alpha: e42bd6d93a1d3433c486200587f8f9e12590a4d7
3535
refs/heads/tmp: 579e31929feff51dcaf8d444648eff8de735f91a

branches/beta/src/doc/index.md

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,14 @@ to jump to any particular section.
55

66
# Getting Started
77

8-
If you haven't seen Rust at all yet, the first thing you should read is the [30
9-
minute intro](intro.html). It will give you an overview of the basic ideas of Rust
10-
at a high level.
11-
12-
Once you know you really want to learn Rust, the next step is reading [The
13-
Rust Programming Language](book/index.html). It is a lengthy explanation of
14-
Rust, its syntax, and its concepts. Upon completing the book, you'll be an
15-
intermediate Rust developer, and will have a good grasp of the fundamental
16-
ideas behind Rust.
8+
If you haven't seen Rust at all yet, the first thing you should read is the
9+
introduction to [The Rust Programming Language](book/index.html). It'll give
10+
you a good idea of what Rust is like.
11+
12+
The book provides a lengthy explanation of Rust, its syntax, and its
13+
concepts. Upon completing the book, you'll be an intermediate Rust
14+
developer, and will have a good grasp of the fundamental ideas behind
15+
Rust.
1716

1817
[Rust By Example][rbe] was originally a community resource, but was then
1918
donated to the Rust project. As the name implies, it teaches you Rust through a

branches/beta/src/doc/trpl/SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
* [Concurrency](concurrency.md)
1616
* [Error Handling](error-handling.md)
1717
* [FFI](ffi.md)
18+
* [Borrow and AsRef](borrow-and-asref.md)
1819
* [Syntax and Semantics](syntax-and-semantics.md)
1920
* [Variable Bindings](variable-bindings.md)
2021
* [Functions](functions.md)
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
% Borrow and AsRef
2+
3+
The [`Borrow`][borrow] and [`AsRef`][asref] traits are very similar, but
4+
different. Here’s a quick refresher on what these two traits mean.
5+
6+
[borrow]: ../std/borrow/trait.Borrow.html
7+
[asref]: ../std/convert/trait.AsRef.html
8+
9+
# Borrow
10+
11+
The `Borrow` trait is used when you’re writing a datastructure, and you want to
12+
use either an owned or borrowed type as synonymous for some purpose.
13+
14+
For example, [`HashMap`][hashmap] has a [`get` method][get] which uses `Borrow`:
15+
16+
```rust,ignore
17+
fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V>
18+
where K: Borrow<Q>,
19+
Q: Hash + Eq
20+
```
21+
22+
[hashmap]: ../std/collections/struct.HashMap.html
23+
[get]: ../std/collections/struct.HashMap.html#method.get
24+
25+
This signature is pretty complicated. The `K` parameter is what we’re interested
26+
in here. It refers to a parameter of the `HashMap` itself:
27+
28+
```rust,ignore
29+
struct HashMap<K, V, S = RandomState> {
30+
```
31+
32+
The `K` parameter is the type of _key_ the `HashMap` uses. So, looking at
33+
the signature of `get()` again, we can use `get()` when the key implements
34+
`Borrow<Q>`. That way, we can make a `HashMap` which uses `String` keys,
35+
but use `&str`s when we’re searching:
36+
37+
```rust
38+
use std::collections::HashMap;
39+
40+
let mut map = HashMap::new();
41+
map.insert("Foo".to_string(), 42);
42+
43+
assert_eq!(map.get("Foo"), Some(&42));
44+
```
45+
46+
This is because the standard library has `impl Borrow<str> for String`.
47+
48+
For most types, when you want to take an owned or borrowed type, a `&T` is
49+
enough. But one area where `Borrow` is effective is when there’s more than one
50+
kind of borrowed value. Slices are an area where this is especially true: you
51+
can have both an `&[T]` or a `&mut [T]`. If we wanted to accept both of these
52+
types, `Borrow` is up for it:
53+
54+
```
55+
use std::borrow::Borrow;
56+
use std::fmt::Display;
57+
58+
fn foo<T: Borrow<i32> + Display>(a: T) {
59+
println!("a is borrowed: {}", a);
60+
}
61+
62+
let mut i = 5;
63+
64+
foo(&i);
65+
foo(&mut i);
66+
```
67+
68+
This will print out `a is borrowed: 5` twice.
69+
70+
# AsRef
71+
72+
The `AsRef` trait is a conversion trait. It’s used for converting some value to
73+
a reference in generic code. Like this:
74+
75+
```rust
76+
let s = "Hello".to_string();
77+
78+
fn foo<T: AsRef<str>>(s: T) {
79+
let slice = s.as_ref();
80+
}
81+
```
82+
83+
# Which should I use?
84+
85+
We can see how they’re kind of the same: they both deal with owned and borrowed
86+
versions of some type. However, they’re a bit different.
87+
88+
Choose `Borrow` when you want to abstract over different kinds of borrowing, or
89+
when you’re building a datastructure that treats owned and borrowed values in
90+
equivalent ways, such as hashing and comparison.
91+
92+
Choose `AsRef` when you want to convert something to a reference directly, and
93+
you’re writing generic code.

branches/beta/src/doc/trpl/lifetimes.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Rust’s most unique and compelling features, with which Rust developers should
55
become quite acquainted. Ownership is how Rust achieves its largest goal,
66
memory safety. There are a few distinct concepts, each with its own chapter:
77

8-
* [ownership][ownership], ownership, the key concept
8+
* [ownership][ownership], the key concept
99
* [borrowing][borrowing], and their associated feature ‘references’
1010
* lifetimes, which you’re reading now
1111

branches/beta/src/doc/trpl/ownership.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ become quite acquainted. Ownership is how Rust achieves its largest goal,
66
memory safety. There are a few distinct concepts, each with its own
77
chapter:
88

9-
* ownership, which you’re reading now.
9+
* ownership, which you’re reading now
1010
* [borrowing][borrowing], and their associated feature ‘references’
1111
* [lifetimes][lifetimes], an advanced concept of borrowing
1212

@@ -23,7 +23,7 @@ Before we get to the details, two important notes about the ownership system.
2323
Rust has a focus on safety and speed. It accomplishes these goals through many
2424
‘zero-cost abstractions’, which means that in Rust, abstractions cost as little
2525
as possible in order to make them work. The ownership system is a prime example
26-
of a zero cost abstraction. All of the analysis we’ll talk about in this guide
26+
of a zero-cost abstraction. All of the analysis we’ll talk about in this guide
2727
is _done at compile time_. You do not pay any run-time cost for any of these
2828
features.
2929

@@ -41,7 +41,7 @@ With that in mind, let’s learn about ownership.
4141

4242
# Ownership
4343

44-
[`Variable bindings`][bindings] have a property in Rust: they ‘have ownership’
44+
[Variable bindings][bindings] have a property in Rust: they ‘have ownership’
4545
of what they’re bound to. This means that when a binding goes out of scope, the
4646
resource that they’re bound to are freed. For example:
4747

@@ -106,8 +106,8 @@ take(v);
106106
println!("v[0] is: {}", v[0]);
107107
```
108108

109-
Same error: use of moved value.” When we transfer ownership to something else,
110-
we say that we’ve ‘moved’ the thing we refer to. You don’t need some sort of
109+
Same error: use of moved value’. When we transfer ownership to something else,
110+
we say that we’ve ‘moved’ the thing we refer to. You don’t need any sort of
111111
special annotation here, it’s the default thing that Rust does.
112112

113113
## The details
@@ -121,19 +121,19 @@ let v = vec![1, 2, 3];
121121
let v2 = v;
122122
```
123123

124-
The first line creates some data for the vector on the [stack][sh], `v`. The
125-
vector’s data, however, is stored on the [heap][sh], and so it contains a
126-
pointer to that data. When we move `v` to `v2`, it creates a copy of that pointer,
127-
for `v2`. Which would mean two pointers to the contents of the vector on the
128-
heap. That would be a problem: it would violate Rust’s safety guarantees by
129-
introducing a data race. Therefore, Rust forbids using `v` after we’ve done the
130-
move.
124+
The first line allocates memory for the vector object, `v`, and for the data it
125+
contains. The vector object is stored on the [stack][sh] and contains a pointer
126+
to the content (`[1, 2, 3]`) stored on the [heap][sh]. When we move `v` to `v2`,
127+
it creates a copy of that pointer, for `v2`. Which means that there would be two
128+
pointers to the content of the vector on the heap. It would violate Rust’s
129+
safety guarantees by introducing a data race. Therefore, Rust forbids using `v`
130+
after we’ve done the move.
131131

132132
[sh]: the-stack-and-the-heap.html
133133

134134
It’s also important to note that optimizations may remove the actual copy of
135-
the bytes, depending on circumstances. So it may not be as inefficient as it
136-
initially seems.
135+
the bytes on the stack, depending on circumstances. So it may not be as
136+
inefficient as it initially seems.
137137

138138
## `Copy` types
139139

branches/beta/src/doc/trpl/primitive-types.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ let x = true;
1515
let y: bool = false;
1616
```
1717

18-
A common use of booleans is in [`if` statements][if].
18+
A common use of booleans is in [`if` conditionals][if].
1919

2020
[if]: if.html
2121

branches/beta/src/doc/trpl/while-loops.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
% while loops
1+
% while Loops
22

33
Rust also has a `while` loop. It looks like this:
44

branches/beta/src/libcollections/borrow.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ use self::Cow::*;
3737
/// trait: if `T: Borrow<U>`, then `&U` can be borrowed from `&T`. A given
3838
/// type can be borrowed as multiple different types. In particular, `Vec<T>:
3939
/// Borrow<Vec<T>>` and `Vec<T>: Borrow<[T]>`.
40+
///
41+
/// `Borrow` is very similar to, but different than, `AsRef`. See
42+
/// [the book][book] for more.
43+
///
44+
/// [book]: ../../book/borrow-and-asref.html
4045
#[stable(feature = "rust1", since = "1.0.0")]
4146
pub trait Borrow<Borrowed: ?Sized> {
4247
/// Immutably borrows from an owned value.

branches/beta/src/libcore/convert.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ use marker::Sized;
2424

2525
/// A cheap, reference-to-reference conversion.
2626
///
27+
/// `AsRef` is very similar to, but different than, `Borrow`. See
28+
/// [the book][book] for more.
29+
///
30+
/// [book]: ../../book/borrow-and-asref.html
31+
///
2732
/// # Examples
2833
///
2934
/// Both `String` and `&str` implement `AsRef<str>`:

0 commit comments

Comments
 (0)