Skip to content

Commit 5cb38ad

Browse files
steveklabnikalexcrichton
authored andcommitted
---
yaml --- r: 167534 b: refs/heads/snap-stage3 c: e76bd7e h: refs/heads/master v: v3
1 parent 24bd216 commit 5cb38ad

File tree

2 files changed

+49
-35
lines changed

2 files changed

+49
-35
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
refs/heads/master: 023dfb0c898d851dee6ace2f8339b73b5287136b
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: c32d03f4172580e3f33e4844ed3c01234dca2d53
4+
refs/heads/snap-stage3: e76bd7e75d3ab7e7091817dc84d03e29c86f32eb
55
refs/heads/try: 5204084bd2e46af7cc6e0147430e44dd0d657bbb
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d

branches/snap-stage3/src/doc/guide.md

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,10 +1100,17 @@ enum Ordering {
11001100
```
11011101

11021102
An `Ordering` can only be _one_ of `Less`, `Equal`, or `Greater` at any given
1103-
time. Here's an example:
1103+
time.
1104+
1105+
Because `Ordering` is provided by the standard library, we can use the `use`
1106+
keyword to use it in our code. We'll learn more about `use` later, but it's
1107+
used to bring names into scope.
1108+
1109+
Here's an example of how to use `Ordering`:
11041110

11051111
```{rust}
1106-
# use std::cmp::Ordering;
1112+
use std::cmp::Ordering;
1113+
11071114
fn cmp(a: int, b: int) -> Ordering {
11081115
if a < b { Ordering::Less }
11091116
else if a > b { Ordering::Greater }
@@ -1126,18 +1133,25 @@ fn main() {
11261133
}
11271134
```
11281135

1129-
`cmp` is a function that compares two things, and returns an `Ordering`. We
1130-
return either `Less`, `Greater`, or `Equal`, depending on if the two values
1131-
are greater, less, or equal.
1136+
There's a symbol here we haven't seen before: the double colon (`::`).
1137+
This is used to indicate a namesapce. In this case, `Ordering` lives in
1138+
the `cmp` submodule of the `std` module. We'll talk more about modules
1139+
later in the guide. For now, all you need to know is that you can `use`
1140+
things from the standard library if you need them.
11321141

1133-
The `ordering` variable has the type `Ordering`, and so contains one of the
1134-
three values. We can then do a bunch of `if`/`else` comparisons to check
1135-
which one it is.
1142+
Okay, let's talk about the actual code in the example. `cmp` is a function that
1143+
compares two things, and returns an `Ordering`. We return either
1144+
`Ordering::Less`, `Ordering::Greater`, or `Ordering::Equal`, depending on if
1145+
the two values are greater, less, or equal. Note that each variant of the
1146+
`enum` is namespaced under the `enum` itself: it's `Ordering::Greater` not
1147+
`Greater`.
11361148

1137-
However, repeated `if`/`else` comparisons get quite tedious. Rust has a feature
1138-
that not only makes them nicer to read, but also makes sure that you never
1139-
miss a case. Before we get to that, though, let's talk about another kind of
1140-
enum: one with values.
1149+
The `ordering` variable has the type `Ordering`, and so contains one of the
1150+
three values. We can then do a bunch of `if`/`else` comparisons to check which
1151+
one it is. However, repeated `if`/`else` comparisons get quite tedious. Rust
1152+
has a feature that not only makes them nicer to read, but also makes sure that
1153+
you never miss a case. Before we get to that, though, let's talk about another
1154+
kind of enum: one with values.
11411155

11421156
This enum has two variants, one of which has a value:
11431157

@@ -1170,18 +1184,19 @@ enum StringResult {
11701184
ErrorReason(String),
11711185
}
11721186
```
1173-
Where a `StringResult` is either a `StringOK`, with the result of a computation, or an
1174-
`ErrorReason` with a `String` explaining what caused the computation to fail. These kinds of
1175-
`enum`s are actually very useful and are even part of the standard library.
1187+
Where a `StringResult` is either a `StringResult::StringOK`, with the result of
1188+
a computation, or an `StringResult::ErrorReason` with a `String` explaining
1189+
what caused the computation to fail. These kinds of `enum`s are actually very
1190+
useful and are even part of the standard library.
11761191

1177-
Enum variants are namespaced under the enum names. For example, here is an example of using
1178-
our `StringResult`:
1192+
Here is an example of using our `StringResult`:
11791193

11801194
```rust
1181-
# enum StringResult {
1182-
# StringOK(String),
1183-
# ErrorReason(String),
1184-
# }
1195+
enum StringResult {
1196+
StringOK(String),
1197+
ErrorReason(String),
1198+
}
1199+
11851200
fn respond(greeting: &str) -> StringResult {
11861201
if greeting == "Hello" {
11871202
StringResult::StringOK("Good morning!".to_string())
@@ -1191,10 +1206,7 @@ fn respond(greeting: &str) -> StringResult {
11911206
}
11921207
```
11931208

1194-
Notice that we need both the enum name and the variant name: `StringResult::StringOK`, but
1195-
we didn't need to with `Ordering` – we just said `Greater` rather than `Ordering::Greater`.
1196-
There's a reason: the Rust prelude imports the variants of `Ordering` as well as the enum
1197-
itself. We can use the `use` keyword to do something similar with `StringResult`:
1209+
That's a lot of typing! We can use the `use` keyword to make it shorter:
11981210

11991211
```rust
12001212
use StringResult::StringOK;
@@ -1216,12 +1228,11 @@ fn respond(greeting: &str) -> StringResult {
12161228
}
12171229
```
12181230

1219-
We'll learn more about `use` later, but it's used to bring names into scope. `use` declarations
1220-
must come before anything else, which looks a little strange in this example, since we `use`
1221-
the variants before we define them. Anyway, in the body of `respond`, we can just say `StringOK`
1222-
now, rather than the full `StringResult::StringOK`. Importing variants can be convenient, but can
1223-
also cause name conflicts, so do this with caution. It's considered good style to rarely import
1224-
variants for this reason.
1231+
`use` declarations must come before anything else, which looks a little strange in this example,
1232+
since we `use` the variants before we define them. Anyway, in the body of `respond`, we can just
1233+
say `StringOK` now, rather than the full `StringResult::StringOK`. Importing variants can be
1234+
convenient, but can also cause name conflicts, so do this with caution. It's considered good style
1235+
to rarely import variants for this reason.
12251236

12261237
As you can see, `enum`s with values are quite a powerful tool for data representation,
12271238
and can be even more useful when they're generic across types. Before we get to generics,
@@ -1275,7 +1286,8 @@ for every possible value of `x`, and so our program will compile successfully.
12751286
section on enums?
12761287

12771288
```{rust}
1278-
# use std::cmp::Ordering;
1289+
use std::cmp::Ordering;
1290+
12791291
fn cmp(a: int, b: int) -> Ordering {
12801292
if a < b { Ordering::Less }
12811293
else if a > b { Ordering::Greater }
@@ -1301,7 +1313,8 @@ fn main() {
13011313
We can re-write this as a `match`:
13021314

13031315
```{rust}
1304-
# use std::cmp::Ordering;
1316+
use std::cmp::Ordering;
1317+
13051318
fn cmp(a: int, b: int) -> Ordering {
13061319
if a < b { Ordering::Less }
13071320
else if a > b { Ordering::Greater }
@@ -1362,7 +1375,8 @@ side of a `let` binding or directly where an expression is used. We could
13621375
also implement the previous line like this:
13631376

13641377
```{rust}
1365-
# use std::cmp::Ordering;
1378+
use std::cmp::Ordering;
1379+
13661380
fn cmp(a: int, b: int) -> Ordering {
13671381
if a < b { Ordering::Less }
13681382
else if a > b { Ordering::Greater }

0 commit comments

Comments
 (0)