diff options
| author | Steve Klabnik <steve@steveklabnik.com> | 2016-07-06 19:13:05 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-07-06 19:13:05 -0400 |
| commit | 155f0ec5c9ec09daccbf5a00f5707964922c3141 (patch) | |
| tree | 0ea9661f2b78d46b3a3aca81c69122c09b69de3b | |
| parent | 34c9cddc89573131d9691309cb2425d7db1ddc6e (diff) | |
| parent | 74e96299a22ef1629d7ea8268815fc2b82c7e194 (diff) | |
Rollup merge of #33250 - durka:patch-19, r=steveklabnik
update documentation of tuple/unit structs I made the "tuple structs are useless" editorializing a bit weaker and moved it to the end. Feel free to overrule me on that. I also added an example of how to unpack a tuple struct with dot notation, because it came up on IRC. `braced_empty_structs` is stable now, so I updated the example for unit-like structs to use that syntax. Should we show both ways? cc @ubsan r? @steveklabnik or @GuillaumeGomez
| -rw-r--r-- | src/doc/book/structs.md | 73 |
1 files changed, 50 insertions, 23 deletions
diff --git a/src/doc/book/structs.md b/src/doc/book/structs.md index b2fddf33627..328db25b819 100644 --- a/src/doc/book/structs.md +++ b/src/doc/book/structs.md @@ -163,11 +163,51 @@ struct Point(i32, i32, i32); let black = Color(0, 0, 0); let origin = Point(0, 0, 0); ``` -Here, `black` and `origin` are not equal, even though they contain the same -values. -It is almost always better to use a `struct` than a tuple struct. We -would write `Color` and `Point` like this instead: +Here, `black` and `origin` are not the same type, even though they contain the +same values. + +The members of a tuple struct may be accessed by dot notation or destructuring +`let`, just like regular tuples: + +```rust +# struct Color(i32, i32, i32); +# struct Point(i32, i32, i32); +# let black = Color(0, 0, 0); +# let origin = Point(0, 0, 0); +let black_r = black.0; +let Point(_, origin_y, origin_z) = origin; +``` + +Patterns like `Point(_, origin_y, origin_z)` are also used in +[match expressions][match]. + +One case when a tuple struct is very useful is when it has only one element. +We call this the ‘newtype’ pattern, because it allows you to create a new type +that is distinct from its contained value and also expresses its own semantic +meaning: + +```rust +struct Inches(i32); + +let length = Inches(10); + +let Inches(integer_length) = length; +println!("length is {} inches", integer_length); +``` + +As above, you can extract the inner integer type through a destructuring `let`. +In this case, the `let Inches(integer_length)` assigns `10` to `integer_length`. +We could have used dot notation to do the same thing: + +```rust +# struct Inches(i32); +# let length = Inches(10); +let integer_length = length.0; +``` + +It's always possible to use a `struct` instead of a tuple struct, and can be +clearer. We could write `Color` and `Point` like this instead: ```rust struct Color { @@ -187,32 +227,19 @@ Good names are important, and while values in a tuple struct can be referenced with dot notation as well, a `struct` gives us actual names, rather than positions. -There _is_ one case when a tuple struct is very useful, though, and that is when -it has only one element. We call this the ‘newtype’ pattern, because -it allows you to create a new type that is distinct from its contained value -and also expresses its own semantic meaning: - -```rust -struct Inches(i32); - -let length = Inches(10); - -let Inches(integer_length) = length; -println!("length is {} inches", integer_length); -``` - -As you can see here, you can extract the inner integer type through a -destructuring `let`, as with regular tuples. In this case, the -`let Inches(integer_length)` assigns `10` to `integer_length`. +[match]: match.html # Unit-like structs You can define a `struct` with no members at all: ```rust -struct Electron; +struct Electron {} // use empty braces... +struct Proton; // ...or just a semicolon -let x = Electron; +// whether you declared the struct with braces or not, do the same when creating one +let x = Electron {}; +let y = Proton; ``` Such a `struct` is called ‘unit-like’ because it resembles the empty |
