Skip to content

Misc book improvements #25948

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jun 9, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions src/doc/trpl/closures.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ let plus_two = |x| {
assert_eq!(4, plus_two(2));
```

You’ll notice a few things about closures that are a bit different than regular
functions defined with `fn`. The first of which is that we did not need to
You’ll notice a few things about closures that are a bit different from regular
functions defined with `fn`. The first is that we did not need to
annotate the types of arguments the closure takes or the values it returns. We
can:

Expand All @@ -48,18 +48,18 @@ But we don’t have to. Why is this? Basically, it was chosen for ergonomic reas
While specifying the full type for named functions is helpful with things like
documentation and type inference, the types of closures are rarely documented
since they’re anonymous, and they don’t cause the kinds of error-at-a-distance
that inferring named function types can.
problems that inferring named function types can.

The second is that the syntax is similar, but a bit different. I’ve added spaces
here to make them look a little closer:
here for easier comparison:

```rust
fn plus_one_v1 (x: i32) -> i32 { x + 1 }
let plus_one_v2 = |x: i32| -> i32 { x + 1 };
let plus_one_v3 = |x: i32| x + 1 ;
```

Small differences, but they’re similar in ways.
Small differences, but they’re similar.

# Closures and their environment

Expand Down Expand Up @@ -99,7 +99,7 @@ note: previous borrow ends here
fn main() {
let mut num = 5;
let plus_num = |x| x + num;

let y = &mut num;
}
^
Expand Down Expand Up @@ -161,7 +161,7 @@ of `num`. So what’s the difference?
```rust
let mut num = 5;

{
{
let mut add_num = |x: i32| num += x;

add_num(5);
Expand All @@ -180,7 +180,7 @@ If we change to a `move` closure, it’s different:
```rust
let mut num = 5;

{
{
let mut add_num = move |x: i32| num += x;

add_num(5);
Expand Down
4 changes: 2 additions & 2 deletions src/doc/trpl/trait-objects.md
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ static Foo_for_String_vtable: FooVtable = FooVtable {
```

The `destructor` field in each vtable points to a function that will clean up
any resources of the vtable’s type, for `u8` it is trivial, but for `String` it
any resources of the vtable’s type: for `u8` it is trivial, but for `String` it
will free the memory. This is necessary for owning trait objects like
`Box<Foo>`, which need to clean-up both the `Box` allocation as well as the
internal type when they go out of scope. The `size` and `align` fields store
Expand All @@ -270,7 +270,7 @@ essentially unused at the moment since the information is embedded in the
destructor, but will be used in the future, as trait objects are progressively
made more flexible.

Suppose we’ve got some values that implement `Foo`, then the explicit form of
Suppose we’ve got some values that implement `Foo`. The explicit form of
construction and use of `Foo` trait objects might look a bit like (ignoring the
type mismatches: they’re all just pointers anyway):

Expand Down
10 changes: 5 additions & 5 deletions src/doc/trpl/traits.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ but we don’t define a body, just a type signature. When we `impl` a trait,
we use `impl Trait for Item`, rather than just `impl Item`.

We can use traits to constrain our generics. Consider this function, which
does not compile, and gives us a similar error:
does not compile:

```rust,ignore
fn print_area<T>(shape: T) {
Expand All @@ -56,7 +56,7 @@ fn print_area<T>(shape: T) {
Rust complains:

```text
error: type `T` does not implement any method in scope named `area`
error: no method named `area` found for type `T` in the current scope
```

Because `T` can be any type, we can’t be sure that it implements the `area`
Expand Down Expand Up @@ -212,10 +212,10 @@ This will compile without error.
This means that even if someone does something bad like add methods to `i32`,
it won’t affect you, unless you `use` that trait.

There’s one more restriction on implementing traits. Either the trait or the
type you’re writing the `impl` for must be defined by you. So, we could
There’s one more restriction on implementing traits: either the trait, or the
type you’re writing the `impl` for, must be defined by you. So, we could
implement the `HasArea` type for `i32`, because `HasArea` is in our code. But
if we tried to implement `Float`, a trait provided by Rust, for `i32`, we could
if we tried to implement `ToString`, a trait provided by Rust, for `i32`, we could
not, because neither the trait nor the type are in our code.

One last thing about traits: generic functions with a trait bound use
Expand Down