Skip to content

Rollup of other PRs in the queue; Friday #24759

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 27 commits into from
Apr 24, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
47ebc48
Implement IntoIterator for Receiver
rapha Apr 20, 2015
efb457b
object type -> trait object
nwin Apr 23, 2015
a8f5989
typo
nwin Apr 23, 2015
99fd7f2
typo 2
nwin Apr 23, 2015
58b3b8b
Update supported values of target_os
vadimcn Apr 23, 2015
17934e5
Do not include attributes in trait item spans.
nrc Apr 23, 2015
1b87837
Clarify that //! comments are also doc comments.
mbrubeck Apr 23, 2015
ad2684c
TRPL: Fix link to macro section of reference
geofft Apr 23, 2015
17390a1
Update and organize the Keywords table
mbrubeck Apr 23, 2015
2f49122
TRPL: Remove references to "advanced macros chapter"
geofft Apr 23, 2015
4cab21c
Also mention `/*!` doc comments.
mbrubeck Apr 23, 2015
21f278a
Auto merge of #24633 - rapha:master, r=alexcrichton
bors Apr 23, 2015
da5f80c
Improve information about loops
Apr 23, 2015
3ae6a5e
Fixed typo
Apr 23, 2015
352838e
Update "Generic Functions" section
Apr 24, 2015
4db0efb
Update reference.md
tynopex Apr 24, 2015
be26031
Rollup merge of #24733 - nwin:patch-1, r=steveklabnik
Manishearth Apr 24, 2015
cda0083
Rollup merge of #24734 - vadimcn:patch-1, r=alexcrichton
Manishearth Apr 24, 2015
5a61d43
Rollup merge of #24739 - nrc:span-item, r=huonw
Manishearth Apr 24, 2015
9863f2c
Rollup merge of #24740 - mbrubeck:reference, r=steveklabnik
Manishearth Apr 24, 2015
292a25f
Rollup merge of #24742 - mbrubeck:keywords, r=steveklabnik
Manishearth Apr 24, 2015
7e3bb03
Rollup merge of #24743 - geofft:trpl-macros-links, r=steveklabnik
Manishearth Apr 24, 2015
76dd691
Rollup merge of #24750 - withoutboats:patch-1, r=steveklabnik
Manishearth Apr 24, 2015
f91216b
Rollup merge of #24752 - doomrobo:patch-1, r=steveklabnik
Manishearth Apr 24, 2015
53d6b38
Rollup merge of #24753 - tynopex:patch-1, r=steveklabnik
Manishearth Apr 24, 2015
a33b5d3
Rollup merge of #24754 - iliekturtles:patch-1, r=steveklabnik
Manishearth Apr 24, 2015
131b5ac
fixup #24754
Manishearth Apr 24, 2015
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
160 changes: 96 additions & 64 deletions src/doc/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,9 +149,11 @@ sequence (`/**`), are interpreted as a special syntax for `doc`
`#[doc="..."]` around the body of the comment (this includes the comment
characters themselves, i.e. `/// Foo` turns into `#[doc="/// Foo"]`).

`//!` comments apply to the parent of the comment, rather than the item that
follows. `//!` comments are usually used to display information on the crate
index page.
Line comments beginning with `//!` and block comments beginning with `/*!` are
doc comments that apply to the parent of the comment, rather than the item
that follows. That is, they are equivalent to writing `#![doc="..."]` around
the body of the comment. `//!` comments are usually used to display
information on the crate index page.

Non-doc comments are interpreted as a form of whitespace.

Expand Down Expand Up @@ -196,10 +198,11 @@ grammar as double-quoted strings. Other tokens have exact rules given.
| fn | for | if | impl | in |
| let | loop | macro | match | mod |
| move | mut | offsetof | override | priv |
| pub | pure | ref | return | sizeof |
| static | self | struct | super | true |
| trait | type | typeof | unsafe | unsized |
| use | virtual | where | while | yield |
| proc | pub | pure | ref | return |
| Self | self | sizeof | static | struct |
| super | trait | true | type | typeof |
| unsafe | unsized | use | virtual | where |
| while | yield | | | |


Each of these keywords has special meaning in its grammar, and all of them are
Expand Down Expand Up @@ -697,9 +700,9 @@ in macro rules). In the transcriber, the designator is already known, and so
only the name of a matched nonterminal comes after the dollar sign.

In both the matcher and transcriber, the Kleene star-like operator indicates
repetition. The Kleene star operator consists of `$` and parenthesis, optionally
repetition. The Kleene star operator consists of `$` and parentheses, optionally
followed by a separator token, followed by `*` or `+`. `*` means zero or more
repetitions, `+` means at least one repetition. The parenthesis are not matched or
repetitions, `+` means at least one repetition. The parentheses are not matched or
transcribed. On the matcher side, a name is bound to _all_ of the names it
matches, in a structure that mimics the structure of the repetition encountered
on a successful match. The job of the transcriber is to sort that structure
Expand Down Expand Up @@ -1099,40 +1102,31 @@ signature. Each type parameter must be explicitly declared, in an
angle-bracket-enclosed, comma-separated list following the function name.

```{.ignore}
fn iter<T>(seq: &[T], f: |T|) {
for elt in seq.iter() { f(elt); }
fn iter<T, F>(seq: &[T], f: F) where T: Copy, F: Fn(T) {
for elt in seq { f(*elt); }
}
fn map<T, U>(seq: &[T], f: |T| -> U) -> Vec<U> {
fn map<T, U, F>(seq: &[T], f: F) -> Vec<U> where T: Copy, U: Copy, F: Fn(T) -> U {
let mut acc = vec![];
for elt in seq.iter() { acc.push(f(elt)); }
for elt in seq { acc.push(f(*elt)); }
acc
}
```

Inside the function signature and body, the name of the type parameter can be
used as a type name.
used as a type name. [Trait](#traits) bounds can be specified for type parameters
to allow methods with that trait to be called on values of that type. This is
specified using the `where` syntax, as in the above example.

When a generic function is referenced, its type is instantiated based on the
context of the reference. For example, calling the `iter` function defined
above on `[1, 2]` will instantiate type parameter `T` with `i32`, and require
the closure parameter to have type `fn(i32)`.
the closure parameter to have type `Fn(i32)`.

The type parameters can also be explicitly supplied in a trailing
[path](#paths) component after the function name. This might be necessary if
there is not sufficient context to determine the type parameters. For example,
`mem::size_of::<u32>() == 4`.

Since a parameter type is opaque to the generic function, the set of operations
that can be performed on it is limited. Values of parameter type can only be
moved, not copied.

```
fn id<T>(x: T) -> T { x }
```

Similarly, [trait](#traits) bounds can be specified for type parameters to
allow methods with that trait to be called on values of that type.

#### Unsafety

Unsafe operations are those that potentially violate the memory-safety
Expand Down Expand Up @@ -1555,7 +1549,7 @@ fn draw_twice<T: Shape>(surface: Surface, sh: T) {
}
```

Traits also define an [object type](#object-types) with the same name as the
Traits also define an [trait object](#trait-objects) with the same name as the
trait. Values of this type are created by [casting](#type-cast-expressions)
pointer values (pointing to a type for which an implementation of the given
trait is in scope) to pointers to the trait name, used as a type.
Expand Down Expand Up @@ -2146,7 +2140,7 @@ The following configurations must be defined by the implementation:
`"unix"` or `"windows"`. The value of this configuration option is defined
as a configuration itself, like `unix` or `windows`.
* `target_os = "..."`. Operating system of the target, examples include
`"win32"`, `"macos"`, `"linux"`, `"android"`, `"freebsd"`, `"dragonfly"`,
`"windows"`, `"macos"`, `"ios"`, `"linux"`, `"android"`, `"freebsd"`, `"dragonfly"`,
`"bitrig"` or `"openbsd"`.
* `target_pointer_width = "..."`. Target pointer width in bits. This is set
to `"32"` for targets with 32-bit pointers, and likewise set to `"64"` for
Expand Down Expand Up @@ -2744,7 +2738,7 @@ A _method call_ consists of an expression followed by a single dot, an
identifier, and a parenthesized expression-list. Method calls are resolved to
methods on specific traits, either statically dispatching to a method if the
exact `self`-type of the left-hand-side is known, or dynamically dispatching if
the left-hand-side expression is an indirect [object type](#object-types).
the left-hand-side expression is an indirect [trait object](#trait-objects).

### Field expressions

Expand Down Expand Up @@ -2812,6 +2806,33 @@ _panicked state_.
(["a", "b"])[10]; // panics
```

### Range expressions

```{.ebnf .gram}
range_expr : expr ".." expr |
expr ".." |
".." expr |
".." ;
```

The `..` operator will construct an object of one of the `std::ops::Range` variants.

```
1..2; // std::ops::Range
3..; // std::ops::RangeFrom
..4; // std::ops::RangeTo
..; // std::ops::RangeFull
```

The following expressions are equivalent.

```
let x = std::ops::Range {start: 0, end: 10};
let y = 0..10;

assert_eq!(x,y);
```

### Unary operator expressions

Rust defines three unary operators. They are all written as prefix operators,
Expand Down Expand Up @@ -3078,28 +3099,6 @@ fn ten_times<F>(f: F) where F: Fn(i32) {
ten_times(|j| println!("hello, {}", j));
```

### While loops

```{.ebnf .gram}
while_expr : [ lifetime ':' ] "while" no_struct_literal_expr '{' block '}' ;
```

A `while` loop begins by evaluating the boolean loop conditional expression.
If the loop conditional expression evaluates to `true`, the loop body block
executes and control returns to the loop conditional expression. If the loop
conditional expression evaluates to `false`, the `while` expression completes.

An example:

```
let mut i = 0;

while i < 10 {
println!("hello");
i = i + 1;
}
```

### Infinite loops

A `loop` expression denotes an infinite loop.
Expand All @@ -3108,10 +3107,11 @@ A `loop` expression denotes an infinite loop.
loop_expr : [ lifetime ':' ] "loop" '{' block '}';
```

A `loop` expression may optionally have a _label_. If a label is present, then
labeled `break` and `continue` expressions nested within this loop may exit out
of this loop or return control to its head. See [Break
expressions](#break-expressions) and [Continue
A `loop` expression may optionally have a _label_. The label is written as
a lifetime preceding the loop expression, as in `'foo: loop{ }`. If a
label is present, then labeled `break` and `continue` expressions nested
within this loop may exit out of this loop or return control to its head.
See [Break expressions](#break-expressions) and [Continue
expressions](#continue-expressions).

### Break expressions
Expand All @@ -3123,7 +3123,7 @@ break_expr : "break" [ lifetime ];
A `break` expression has an optional _label_. If the label is absent, then
executing a `break` expression immediately terminates the innermost loop
enclosing it. It is only permitted in the body of a loop. If the label is
present, then `break foo` terminates the loop with label `foo`, which need not
present, then `break 'foo` terminates the loop with label `'foo`, which need not
be the innermost label enclosing the `break` expression, but must enclose it.

### Continue expressions
Expand All @@ -3137,12 +3137,39 @@ executing a `continue` expression immediately terminates the current iteration
of the innermost loop enclosing it, returning control to the loop *head*. In
the case of a `while` loop, the head is the conditional expression controlling
the loop. In the case of a `for` loop, the head is the call-expression
controlling the loop. If the label is present, then `continue foo` returns
control to the head of the loop with label `foo`, which need not be the
controlling the loop. If the label is present, then `continue 'foo` returns
control to the head of the loop with label `'foo`, which need not be the
innermost label enclosing the `break` expression, but must enclose it.

A `continue` expression is only permitted in the body of a loop.

### While loops

```{.ebnf .gram}
while_expr : [ lifetime ':' ] "while" no_struct_literal_expr '{' block '}' ;
```

A `while` loop begins by evaluating the boolean loop conditional expression.
If the loop conditional expression evaluates to `true`, the loop body block
executes and control returns to the loop conditional expression. If the loop
conditional expression evaluates to `false`, the `while` expression completes.

An example:

```
let mut i = 0;

while i < 10 {
println!("hello");
i = i + 1;
}
```

Like `loop` expressions, `while` loops can be controlled with `break` or
`continue`, and may optionally have a _label_. See [infinite
loops](#infinite-loops), [break expressions](#break-expressions), and
[continue expressions](#continue-expressions) for more information.

### For expressions

```{.ebnf .gram}
Expand Down Expand Up @@ -3177,6 +3204,11 @@ for i in 0..256 {
}
```

Like `loop` expressions, `for` loops can be controlled with `break` or
`continue`, and may optionally have a _label_. See [infinite
loops](#infinite-loops), [break expressions](#break-expressions), and
[continue expressions](#continue-expressions) for more information.

### If expressions

```{.ebnf .gram}
Expand Down Expand Up @@ -3649,23 +3681,23 @@ call_closure(closure_no_args, closure_args);

```

### Object types
### Trait objects

Every trait item (see [traits](#traits)) defines a type with the same name as
the trait. This type is called the _object type_ of the trait. Object types
the trait. This type is called the _trait object_ of the trait. Trait objects
permit "late binding" of methods, dispatched using _virtual method tables_
("vtables"). Whereas most calls to trait methods are "early bound" (statically
resolved) to specific implementations at compile time, a call to a method on an
object type is only resolved to a vtable entry at compile time. The actual
trait objects is only resolved to a vtable entry at compile time. The actual
implementation for each vtable entry can vary on an object-by-object basis.

Given a pointer-typed expression `E` of type `&T` or `Box<T>`, where `T`
implements trait `R`, casting `E` to the corresponding pointer type `&R` or
`Box<R>` results in a value of the _object type_ `R`. This result is
`Box<R>` results in a value of the _trait object_ `R`. This result is
represented as a pair of pointers: the vtable pointer for the `T`
implementation of `R`, and the pointer value of `E`.

An example of an object type:
An example of a trait object:

```
trait Printable {
Expand All @@ -3685,7 +3717,7 @@ fn main() {
}
```

In this example, the trait `Printable` occurs as an object type in both the
In this example, the trait `Printable` occurs as a trait object in both the
type signature of `print`, and the cast expression in `main`.

### Type parameters
Expand Down
7 changes: 3 additions & 4 deletions src/doc/trpl/macros.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,7 @@ let x: Vec<u32> = {
We can implement this shorthand, using a macro: [^actual]

[^actual]: The actual definition of `vec!` in libcollections differs from the
one presented here, for reasons of efficiency and reusability. Some
of these are mentioned in the [advanced macros chapter][].
one presented here, for reasons of efficiency and reusability.

```rust
macro_rules! vec {
Expand Down Expand Up @@ -106,7 +105,7 @@ These have [their own little grammar] within the language.

The matcher `$x:expr` will match any Rust expression, binding that syntax tree
to the ‘metavariable’ `$x`. The identifier `expr` is a ‘fragment specifier’;
the full possibilities are enumerated in the [advanced macros chapter][].
the full possibilities are enumerated later in this chapter.
Surrounding the matcher with `$(...),*` will match zero or more expressions,
separated by commas.

Expand Down Expand Up @@ -566,7 +565,7 @@ When this library is loaded with `#[macro_use] extern crate`, only `m2` will
be imported.

The Rust Reference has a [listing of macro-related
attributes](../reference.html#macro--and-plugin-related-attributes).
attributes](../reference.html#macro-related-attributes).

# The variable `$crate`

Expand Down
Loading