Skip to content

Commit 320dbc1

Browse files
committed
auto merge of #15745 : treeman/rust/tutorial-fixup, r=steveklabnik
Simplify example in 5.2 to remove hidden `#[deriving(Show)]`. Traits haven't been introduced yet and now it's easier to just type in the code and expect it to work. Add in some examples for constructing the enum types. Explicitly expose `#![feature(struct_variant)]` in the code to make it more transparent, this bit me when I worked through the tutorial. Add references in chapter 8 to later chapters describing `Rc`, `Gc` and `Send`. This is a simple fix for #15293. Simplify vector indexing example in chapter 13 and removed hidden, unnecessary, code. Gave an example usage of the derived `Rand` trait in chapter 17. Removed references to removed 'extra' crate.
2 parents 7d0a613 + 89e28d3 commit 320dbc1

File tree

1 file changed

+48
-22
lines changed

1 file changed

+48
-22
lines changed

src/doc/tutorial.md

+48-22
Original file line numberDiff line numberDiff line change
@@ -716,8 +716,8 @@ When an enum has simple integer discriminators, you can apply the `as` cast
716716
operator to convert a variant to its discriminator value as an `int`:
717717

718718
~~~~
719-
# #[deriving(Show)] enum Direction { North }
720-
println!( "{} => {}", North, North as int );
719+
# enum Direction { North, East, South, West }
720+
println!( "North => {}", North as int );
721721
~~~~
722722

723723
It is possible to set the discriminator values to chosen constant values:
@@ -748,15 +748,23 @@ includes an identifier of the actual form that it holds, much like the
748748

749749
This declaration defines a type `Shape` that can refer to such shapes, and two
750750
functions, `Circle` and `Rectangle`, which can be used to construct values of
751-
the type. To create a new Circle, write `Circle(Point { x: 0.0, y: 0.0 },
752-
10.0)`.
751+
the type.
752+
753+
To create a new `Circle`, write:
754+
755+
~~~~
756+
# struct Point { x: f64, y: f64 }
757+
# enum Shape { Circle(Point, f64), Rectangle(Point, Point) }
758+
let circle = Circle(Point { x: 0.0, y: 0.0 }, 10.0);
759+
~~~~
753760

754761
All of these variant constructors may be used as patterns. The only way to
755762
access the contents of an enum instance is the destructuring of a match. For
756763
example:
757764

758765
~~~~
759766
use std::f64;
767+
760768
# struct Point {x: f64, y: f64}
761769
# enum Shape { Circle(Point, f64), Rectangle(Point, Point) }
762770
fn area(sh: Shape) -> f64 {
@@ -765,6 +773,9 @@ fn area(sh: Shape) -> f64 {
765773
Rectangle(Point { x, y }, Point { x: x2, y: y2 }) => (x2 - x) * (y2 - y)
766774
}
767775
}
776+
777+
let rect = Rectangle(Point { x: 0.0, y: 0.0 }, Point { x: 2.0, y: 2.0 });
778+
println!("area: {}", area(rect));
768779
~~~~
769780

770781
Use a lone `_` to ignore an individual field. Ignore all fields of a variant
@@ -786,8 +797,9 @@ fn point_from_direction(dir: Direction) -> Point {
786797
Enum variants may also be structs. For example:
787798

788799
~~~~
789-
# #![feature(struct_variant)]
800+
#![feature(struct_variant)]
790801
use std::f64;
802+
791803
# struct Point { x: f64, y: f64 }
792804
# fn square(x: f64) -> f64 { x * x }
793805
enum Shape {
@@ -802,7 +814,14 @@ fn area(sh: Shape) -> f64 {
802814
}
803815
}
804816
}
805-
# fn main() {}
817+
818+
fn main() {
819+
let rect = Rectangle {
820+
top_left: Point { x: 0.0, y: 0.0 },
821+
bottom_right: Point { x: 2.0, y: -2.0 }
822+
};
823+
println!("area: {}", area(rect));
824+
}
806825
~~~~
807826

808827
> *Note:* This feature of the compiler is currently gated behind the
@@ -986,6 +1005,10 @@ that are `Send`, but non-`Send` types can still *contain* types with custom
9861005
destructors. Example of types which are not `Send` are [`Gc<T>`][gc] and
9871006
[`Rc<T>`][rc], the shared-ownership types.
9881007

1008+
> *Note:* See a [later chapter](#ownership-escape-hatches) for a discussion about
1009+
> [`Gc<T>`][gc] and [`Rc<T>`][rc], and the [chapter about traits](#traits) for
1010+
> a discussion about `Send`.
1011+
9891012
[gc]: http://doc.rust-lang.org/std/gc/struct.Gc.html
9901013
[rc]: http://doc.rust-lang.org/std/rc/struct.Rc.html
9911014

@@ -1645,6 +1668,13 @@ let string = "foobar";
16451668
let view: &str = string.slice(0, 3);
16461669
~~~
16471670

1671+
Square brackets denote indexing into a slice or fixed-size vector:
1672+
1673+
~~~~
1674+
let crayons: [&str, ..3] = ["BananaMania", "Beaver", "Bittersweet"];
1675+
println!("Crayon 2 is '{}'", crayons[2]);
1676+
~~~~
1677+
16481678
Mutable slices also exist, just as there are mutable references. However, there
16491679
are no mutable string slices. Strings are a multi-byte encoding (UTF-8) of
16501680
Unicode code points, so they cannot be freely mutated without the ability to
@@ -1659,20 +1689,6 @@ view[0] = 5;
16591689
let ys: &mut [int] = &mut [1i, 2i, 3i];
16601690
~~~
16611691

1662-
Square brackets denote indexing into a slice or fixed-size vector:
1663-
1664-
~~~~
1665-
# enum Crayon { Almond, AntiqueBrass, Apricot,
1666-
# Aquamarine, Asparagus, AtomicTangerine,
1667-
# BananaMania, Beaver, Bittersweet };
1668-
# fn draw_scene(c: Crayon) { }
1669-
let crayons: [Crayon, ..3] = [BananaMania, Beaver, Bittersweet];
1670-
match crayons[0] {
1671-
Bittersweet => draw_scene(crayons[0]),
1672-
_ => ()
1673-
}
1674-
~~~~
1675-
16761692
A slice or fixed-size vector can be destructured using pattern matching:
16771693

16781694
~~~~
@@ -1738,6 +1754,8 @@ via dynamic checks and can fail at runtime.
17381754
The `Rc` and `Gc` types are not sendable, so they cannot be used to share memory between tasks. Safe
17391755
immutable and mutable shared memory is provided by the `sync::arc` module.
17401756

1757+
> *Note:* See a [later chapter](#traits) for a discussion about `Send` and sendable types.
1758+
17411759
# Closures
17421760

17431761
Named functions, like those we've seen so far, may not refer to local
@@ -2609,7 +2627,7 @@ let nonsense = mycircle.radius() * mycircle.area();
26092627
26102628
## Deriving implementations for traits
26112629

2612-
A small number of traits in `std` and `extra` can have implementations
2630+
A small number of traits in can have implementations
26132631
that can be automatically derived. These instances are specified by
26142632
placing the `deriving` attribute on a data type declaration. For
26152633
example, the following will mean that `Circle` has an implementation
@@ -2618,6 +2636,7 @@ of type `ABC` can be randomly generated and converted to a string:
26182636

26192637
~~~
26202638
extern crate rand;
2639+
use std::rand::{task_rng, Rng};
26212640
26222641
#[deriving(PartialEq)]
26232642
struct Circle { radius: f64 }
@@ -2628,6 +2647,13 @@ enum ABC { A, B, C }
26282647
fn main() {
26292648
// Use the Show trait to print "A, B, C."
26302649
println!("{}, {}, {}", A, B, C);
2650+
2651+
let mut rng = task_rng();
2652+
2653+
// Use the Rand trait to generate a random variants.
2654+
for _ in range(0i, 10) {
2655+
println!("{}", rng.gen::<ABC>());
2656+
}
26312657
}
26322658
~~~
26332659

@@ -3136,8 +3162,8 @@ In Rust terminology, we need a way to refer to other crates.
31363162
For that, Rust offers you the `extern crate` declaration:
31373163

31383164
~~~
3165+
// `num` ships with Rust.
31393166
extern crate num;
3140-
// `num` ships with Rust (much like `extra`; more details further down).
31413167
31423168
fn main() {
31433169
// The rational number '1/2':

0 commit comments

Comments
 (0)