reference.md 152.0 KB
Newer Older
S
Steve Klabnik 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
% The Rust Reference

# Introduction

This document is the primary reference for the Rust programming language. It
provides three kinds of material:

  - Chapters that formally define the language grammar and, for each
    construct, informally describe its semantics and give examples of its
    use.
  - Chapters that informally describe the memory model, concurrency model,
    runtime services, linkage model and debugging facilities.
  - Appendix chapters providing rationale and references to languages that
    influenced the design.

This document does not serve as an introduction to the language. Background
S
Steve Klabnik 已提交
17
familiarity with the language is assumed. A separate [book] is available to
S
Steve Klabnik 已提交
18 19 20 21
help acquire such background familiarity.

This document also does not serve as a reference to the [standard] library
included in the language distribution. Those libraries are documented
22 23 24
separately by extracting documentation attributes from their source code. Many
of the features that one might expect to be language features are library
features in Rust, so what you're looking for may be there, not here.
S
Steve Klabnik 已提交
25

S
Steve Klabnik 已提交
26
[book]: book/index.html
S
Steve Klabnik 已提交
27 28 29 30 31 32 33 34 35 36 37 38
[standard]: std/index.html

# Notation

Rust's grammar is defined over Unicode codepoints, each conventionally denoted
`U+XXXX`, for 4 or more hexadecimal digits `X`. _Most_ of Rust's grammar is
confined to the ASCII range of Unicode, and is described in this document by a
dialect of Extended Backus-Naur Form (EBNF), specifically a dialect of EBNF
supported by common automated LL(k) parsing tools such as `llgen`, rather than
the dialect given in ISO 14977. The dialect can be defined self-referentially
as follows:

S
Steve Klabnik 已提交
39
```{.ebnf .notation}
S
Steve Klabnik 已提交
40 41 42 43 44 45 46
grammar : rule + ;
rule    : nonterminal ':' productionrule ';' ;
productionrule : production [ '|' production ] * ;
production : term * ;
term : element repeats ;
element : LITERAL | IDENTIFIER | '[' productionrule ']' ;
repeats : [ '*' | '+' ] NUMBER ? | NUMBER ? | '?' ;
S
Steve Klabnik 已提交
47
```
S
Steve Klabnik 已提交
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68

Where:

- Whitespace in the grammar is ignored.
- Square brackets are used to group rules.
- `LITERAL` is a single printable ASCII character, or an escaped hexadecimal
  ASCII code of the form `\xQQ`, in single quotes, denoting the corresponding
  Unicode codepoint `U+00QQ`.
- `IDENTIFIER` is a nonempty string of ASCII letters and underscores.
- The `repeat` forms apply to the adjacent `element`, and are as follows:
  - `?` means zero or one repetition
  - `*` means zero or more repetitions
  - `+` means one or more repetitions
  - NUMBER trailing a repeat symbol gives a maximum repetition count
  - NUMBER on its own gives an exact repetition count

This EBNF dialect should hopefully be familiar to many readers.

## Unicode productions

A few productions in Rust's grammar permit Unicode codepoints outside the ASCII
S
Steve Klabnik 已提交
69 70
range. We define these productions in terms of character properties specified
in the Unicode standard, rather than in terms of ASCII-range codepoints. The
S
Steve Klabnik 已提交
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
section [Special Unicode Productions](#special-unicode-productions) lists these
productions.

## String table productions

Some rules in the grammar — notably [unary
operators](#unary-operator-expressions), [binary
operators](#binary-operator-expressions), and [keywords](#keywords) — are
given in a simplified form: as a listing of a table of unquoted, printable
whitespace-separated strings. These cases form a subset of the rules regarding
the [token](#tokens) rule, and are assumed to be the result of a
lexical-analysis phase feeding the parser, driven by a DFA, operating over the
disjunction of all such string table entries.

When such a string enclosed in double-quotes (`"`) occurs inside the grammar,
it is an implicit reference to a single member of such a string table
production. See [tokens](#tokens) for more information.

# Lexical structure

## Input format

Rust input is interpreted as a sequence of Unicode codepoints encoded in UTF-8.
Most Rust grammar rules are defined in terms of printable ASCII-range
codepoints, but a small number are defined in terms of Unicode properties or
explicit codepoint lists. [^inputformat]

[^inputformat]: Substitute definitions for the special Unicode productions are
  provided to the grammar verifier, restricted to ASCII range, when verifying the
  grammar in this document.

## Special Unicode Productions

The following productions in the Rust grammar are defined in terms of Unicode
properties: `ident`, `non_null`, `non_star`, `non_eol`, `non_slash_or_star`,
`non_single_quote` and `non_double_quote`.

### Identifiers

The `ident` production is any nonempty Unicode string of the following form:

- The first character has property `XID_start`
- The remaining characters have property `XID_continue`

that does _not_ occur in the set of [keywords](#keywords).

> **Note**: `XID_start` and `XID_continue` as character properties cover the
> character ranges used to form the more familiar C and Java language-family
> identifiers.

### Delimiter-restricted productions

Some productions are defined by exclusion of particular Unicode characters:

- `non_null` is any single Unicode character aside from `U+0000` (null)
- `non_eol` is `non_null` restricted to exclude `U+000A` (`'\n'`)
- `non_star` is `non_null` restricted to exclude `U+002A` (`*`)
- `non_slash_or_star` is `non_null` restricted to exclude `U+002F` (`/`) and `U+002A` (`*`)
- `non_single_quote` is `non_null` restricted to exclude `U+0027`  (`'`)
- `non_double_quote` is `non_null` restricted to exclude `U+0022` (`"`)

## Comments

S
Steve Klabnik 已提交
134
```{.ebnf .gram}
S
Steve Klabnik 已提交
135
comment : block_comment | line_comment ;
136
block_comment : "/*" block_comment_body * "*/" ;
S
Steve Klabnik 已提交
137 138
block_comment_body : [block_comment | character] * ;
line_comment : "//" non_eol * ;
S
Steve Klabnik 已提交
139
```
S
Steve Klabnik 已提交
140 141

Comments in Rust code follow the general C++ style of line and block-comment
S
Steve Klabnik 已提交
142
forms. Nested block comments are supported.
S
Steve Klabnik 已提交
143 144 145 146

Line comments beginning with exactly _three_ slashes (`///`), and block
comments beginning with exactly one repeated asterisk in the block-open
sequence (`/**`), are interpreted as a special syntax for `doc`
S
Steve Klabnik 已提交
147
[attributes](#attributes). That is, they are equivalent to writing
S
Steve Klabnik 已提交
148 149 150 151 152 153 154 155 156 157 158
`#[doc="..."]` around the body of the comment (this includes the comment
characters themselves, ie `/// 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.

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

## Whitespace

S
Steve Klabnik 已提交
159
```{.ebnf .gram}
S
Steve Klabnik 已提交
160 161
whitespace_char : '\x20' | '\x09' | '\x0a' | '\x0d' ;
whitespace : [ whitespace_char | comment ] + ;
S
Steve Klabnik 已提交
162
```
S
Steve Klabnik 已提交
163 164 165 166 167 168 169 170 171 172 173 174 175

The `whitespace_char` production is any nonempty Unicode string consisting of
any of the following Unicode characters: `U+0020` (space, `' '`), `U+0009`
(tab, `'\t'`), `U+000A` (LF, `'\n'`), `U+000D` (CR, `'\r'`).

Rust is a "free-form" language, meaning that all forms of whitespace serve only
to separate _tokens_ in the grammar, and have no semantic significance.

A Rust program has identical meaning if each whitespace element is replaced
with any other legal whitespace element, such as a single space character.

## Tokens

S
Steve Klabnik 已提交
176
```{.ebnf .gram}
S
Steve Klabnik 已提交
177 178
simple_token : keyword | unop | binop ;
token : simple_token | ident | literal | symbol | whitespace token ;
S
Steve Klabnik 已提交
179
```
S
Steve Klabnik 已提交
180 181 182 183 184 185 186 187

Tokens are primitive productions in the grammar defined by regular
(non-recursive) languages. "Simple" tokens are given in [string table
production](#string-table-productions) form, and occur in the rest of the
grammar as double-quoted strings. Other tokens have exact rules given.

### Keywords

S
Steve Klabnik 已提交
188 189
<p id="keyword-table-marker"></p>

190 191 192 193 194 195
|          |          |          |          |         |
|----------|----------|----------|----------|---------|
| abstract | alignof  | as       | be       | box     |
| break    | const    | continue | crate    | do      |
| else     | enum     | extern   | false    | final   |
| fn       | for      | if       | impl     | in      |
K
Keegan McAllister 已提交
196 197 198 199 200 201
| 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   |
S
Steve Klabnik 已提交
202

S
Steve Klabnik 已提交
203 204 205 206

Each of these keywords has special meaning in its grammar, and all of them are
excluded from the `ident` rule.

S
Steve Klabnik 已提交
207 208 209
Note that some of these keywords are reserved, and do not currently do
anything.

S
Steve Klabnik 已提交
210 211 212 213 214 215 216
### Literals

A literal is an expression consisting of a single token, rather than a sequence
of tokens, that immediately and directly denotes the value it evaluates to,
rather than referring to it by name or some other evaluation rule. A literal is
a form of constant expression, so is evaluated (primarily) at compile time.

S
Steve Klabnik 已提交
217
```{.ebnf .gram}
218 219
lit_suffix : ident;
literal : [ string_lit | char_lit | byte_string_lit | byte_lit | num_lit ] lit_suffix ?;
S
Steve Klabnik 已提交
220
```
S
Steve Klabnik 已提交
221

222 223 224 225 226
The optional suffix is only used for certain numeric literals, but is
reserved for future extension, that is, the above gives the lexical
grammar, but a Rust parser will reject everything but the 12 special
cases mentioned in [Number literals](#number-literals) below.

227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
#### Examples

##### Characters and strings

|   | Example | Number of `#` pairs allowed | Available characters | Escapes | Equivalent to |
|---|---------|-----------------------------|----------------------|---------|---------------|
| [Character](#character-literals) | `'H'` | `N/A` | All unicode | `\'` & [Byte escapes](#byte-escapes) & [Unicode escapes](#unicode-escapes) | `N/A` |
| [String](#string-literals) | `"hello"` | `N/A` | All unicode | `\"` & [Byte escapes](#byte-escapes) & [Unicode escapes](#unicode-escapes) | `N/A` |
| [Raw](#raw-string-literals) | `r##"hello"##`  | `0...` | All unicode | `N/A` | `N/A` |
| [Byte](#byte-literals) | `b'H'` | `N/A` | All ASCII | `\'` & [Byte escapes](#byte-escapes) | `u8` |
| [Byte string](#byte-string-literals) | `b"hello"` | `N/A`  | All ASCII | `\"` & [Byte escapes](#byte-escapes) | `&'static [u8]` |
| [Raw byte string](#raw-byte-string-literals) | `br##"hello"##` | `0...` | All ASCII | `N/A` | `&'static [u8]` (unsure...not stated) |

##### Byte escapes

|   | Name |
|---|------|
| `\x7F` | 8-bit character code (exactly 2 digits) |
| `\n` | Newline |
| `\r` | Carriage return |
| `\t` | Tab |
| `\\` | Backslash |

##### Unicode escapes
|   | Name |
|---|------|
253
| `\u{7FFF}` | 24-bit Unicode character code (up to 6 digits) |
254 255 256 257 258

##### Numbers

| [Number literals](#number-literals)`*` | Example | Exponentiation | Suffixes |
|----------------------------------------|---------|----------------|----------|
259 260 261 262
| Decimal integer | `98_222is` | `N/A` | Integer suffixes |
| Hex integer | `0xffis` | `N/A` | Integer suffixes |
| Octal integer | `0o77is` | `N/A` | Integer suffixes |
| Binary integer | `0b1111_0000is` | `N/A` | Integer suffixes |
263 264 265 266 267 268 269
| Floating-point | `123.0E+77f64` | `Optional` | Floating-point suffixes |

`*` All number literals allow `_` as a visual separator: `1_234.0E+18f64`

##### Suffixes
| Integer | Floating-point |
|---------|----------------|
270
| `u8`, `i8`, `u16`, `i16`, `u32`, `i32`, `u64`, `i64`, `is` (`isize`), `us` (`usize`) | `f32`, `f64` |
271

S
Steve Klabnik 已提交
272 273
#### Character and string literals

S
Steve Klabnik 已提交
274
```{.ebnf .gram}
S
Steve Klabnik 已提交
275 276 277 278 279 280 281 282 283 284 285 286 287
char_lit : '\x27' char_body '\x27' ;
string_lit : '"' string_body * '"' | 'r' raw_string ;

char_body : non_single_quote
          | '\x5c' [ '\x27' | common_escape | unicode_escape ] ;

string_body : non_double_quote
            | '\x5c' [ '\x22' | common_escape | unicode_escape ] ;
raw_string : '"' raw_string_body '"' | '#' raw_string '#' ;

common_escape : '\x5c'
              | 'n' | 'r' | 't' | '0'
              | 'x' hex_digit 2
288 289

unicode_escape : 'u' '{' hex_digit+ 6 '}';
S
Steve Klabnik 已提交
290 291 292 293 294 295 296 297

hex_digit : 'a' | 'b' | 'c' | 'd' | 'e' | 'f'
          | 'A' | 'B' | 'C' | 'D' | 'E' | 'F'
          | dec_digit ;
oct_digit : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' ;
dec_digit : '0' | nonzero_dec ;
nonzero_dec: '1' | '2' | '3' | '4'
           | '5' | '6' | '7' | '8' | '9' ;
S
Steve Klabnik 已提交
298
```
S
Steve Klabnik 已提交
299

300 301
##### Character literals

S
Steve Klabnik 已提交
302 303 304 305
A _character literal_ is a single Unicode character enclosed within two
`U+0027` (single-quote) characters, with the exception of `U+0027` itself,
which must be _escaped_ by a preceding U+005C character (`\`).

306 307
##### String literals

S
Steve Klabnik 已提交
308 309 310 311 312
A _string literal_ is a sequence of any Unicode characters enclosed within two
`U+0022` (double-quote) characters, with the exception of `U+0022` itself,
which must be _escaped_ by a preceding `U+005C` character (`\`), or a _raw
string literal_.

313 314
##### Character escapes

S
Steve Klabnik 已提交
315 316 317 318 319 320 321
Some additional _escapes_ are available in either character or non-raw string
literals. An escape starts with a `U+005C` (`\`) and continues with one of the
following forms:

* An _8-bit codepoint escape_ escape starts with `U+0078` (`x`) and is
  followed by exactly two _hex digits_. It denotes the Unicode codepoint
  equal to the provided hex value.
322 323 324
* A _24-bit codepoint escape_ starts with `U+0075` (`u`) and is followed
  by up to six _hex digits_ surrounded by braces `U+007B` (`{`) and `U+007D`
  (`}`). It denotes the Unicode codepoint equal to the provided hex value.
S
Steve Klabnik 已提交
325 326 327 328 329 330
* A _whitespace escape_ is one of the characters `U+006E` (`n`), `U+0072`
  (`r`), or `U+0074` (`t`), denoting the unicode values `U+000A` (LF),
  `U+000D` (CR) or `U+0009` (HT) respectively.
* The _backslash escape_ is the character `U+005C` (`\`) which must be
  escaped in order to denote *itself*.

331 332
##### Raw string literals

S
Steve Klabnik 已提交
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
Raw string literals do not process any escapes. They start with the character
`U+0072` (`r`), followed by zero or more of the character `U+0023` (`#`) and a
`U+0022` (double-quote) character. The _raw string body_ is not defined in the
EBNF grammar above: it can contain any sequence of Unicode characters and is
terminated only by another `U+0022` (double-quote) character, followed by the
same number of `U+0023` (`#`) characters that preceded the opening `U+0022`
(double-quote) character.

All Unicode characters contained in the raw string body represent themselves,
the characters `U+0022` (double-quote) (except when followed by at least as
many `U+0023` (`#`) characters as were used to start the raw string literal) or
`U+005C` (`\`) do not have any special meaning.

Examples for string literals:

S
Steve Klabnik 已提交
348
```
S
Steve Klabnik 已提交
349 350 351 352 353 354 355 356
"foo"; r"foo";                     // foo
"\"foo\""; r#""foo""#;             // "foo"

"foo #\"# bar";
r##"foo #"# bar"##;                // foo #"# bar

"\x52"; "R"; r"R";                 // R
"\\x52"; r"\x52";                  // \x52
S
Steve Klabnik 已提交
357
```
S
Steve Klabnik 已提交
358 359 360

#### Byte and byte string literals

S
Steve Klabnik 已提交
361
```{.ebnf .gram}
362 363
byte_lit : "b\x27" byte_body '\x27' ;
byte_string_lit : "b\x22" string_body * '\x22' | "br" raw_byte_string ;
S
Steve Klabnik 已提交
364 365 366 367 368 369 370 371

byte_body : ascii_non_single_quote
          | '\x5c' [ '\x27' | common_escape ] ;

byte_string_body : ascii_non_double_quote
            | '\x5c' [ '\x22' | common_escape ] ;
raw_byte_string : '"' raw_byte_string_body '"' | '#' raw_byte_string '#' ;

S
Steve Klabnik 已提交
372
```
S
Steve Klabnik 已提交
373

374 375
##### Byte literals

S
Steve Klabnik 已提交
376 377 378
A _byte literal_ is a single ASCII character (in the `U+0000` to `U+007F`
range) enclosed within two `U+0027` (single-quote) characters, with the
exception of `U+0027` itself, which must be _escaped_ by a preceding U+005C
S
Steve Klabnik 已提交
379
character (`\`), or a single _escape_. It is equivalent to a `u8` unsigned
S
Steve Klabnik 已提交
380 381
8-bit integer _number literal_.

382 383
##### Byte string literals

S
Steve Klabnik 已提交
384 385 386
A _byte string literal_ is a sequence of ASCII characters and _escapes_
enclosed within two `U+0022` (double-quote) characters, with the exception of
`U+0022` itself, which must be _escaped_ by a preceding `U+005C` character
S
Steve Klabnik 已提交
387
(`\`), or a _raw byte string literal_. It is equivalent to a `&'static [u8]`
S
Steve Klabnik 已提交
388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
borrowed array of unsigned 8-bit integers.

Some additional _escapes_ are available in either byte or non-raw byte string
literals. An escape starts with a `U+005C` (`\`) and continues with one of the
following forms:

* An _byte escape_ escape starts with `U+0078` (`x`) and is
  followed by exactly two _hex digits_. It denotes the byte
  equal to the provided hex value.
* A _whitespace escape_ is one of the characters `U+006E` (`n`), `U+0072`
  (`r`), or `U+0074` (`t`), denoting the bytes values `0x0A` (ASCII LF),
  `0x0D` (ASCII CR) or `0x09` (ASCII HT) respectively.
* The _backslash escape_ is the character `U+005C` (`\`) which must be
  escaped in order to denote its ASCII encoding `0x5C`.

403 404
##### Raw byte string literals

S
Steve Klabnik 已提交
405
Raw byte string literals do not process any escapes. They start with the
406
character `U+0062` (`b`), followed by `U+0072` (`r`), followed by zero or more
S
Steve Klabnik 已提交
407
of the character `U+0023` (`#`), and a `U+0022` (double-quote) character. The
S
Steve Klabnik 已提交
408 409 410
_raw string body_ is not defined in the EBNF grammar above: it can contain any
sequence of ASCII characters and is terminated only by another `U+0022`
(double-quote) character, followed by the same number of `U+0023` (`#`)
S
Steve Klabnik 已提交
411
characters that preceded the opening `U+0022` (double-quote) character. A raw
S
Steve Klabnik 已提交
412 413 414 415 416 417 418 419 420
byte string literal can not contain any non-ASCII byte.

All characters contained in the raw string body represent their ASCII encoding,
the characters `U+0022` (double-quote) (except when followed by at least as
many `U+0023` (`#`) characters as were used to start the raw string literal) or
`U+005C` (`\`) do not have any special meaning.

Examples for byte string literals:

S
Steve Klabnik 已提交
421
```
S
Steve Klabnik 已提交
422 423 424 425 426 427 428 429
b"foo"; br"foo";                     // foo
b"\"foo\""; br#""foo""#;             // "foo"

b"foo #\"# bar";
br##"foo #"# bar"##;                 // foo #"# bar

b"\x52"; b"R"; br"R";                // R
b"\\x52"; br"\x52";                  // \x52
S
Steve Klabnik 已提交
430
```
S
Steve Klabnik 已提交
431 432 433

#### Number literals

S
Steve Klabnik 已提交
434
```{.ebnf .gram}
435 436 437 438 439
num_lit : nonzero_dec [ dec_digit | '_' ] * float_suffix ?
        | '0' [       [ dec_digit | '_' ] * float_suffix ?
              | 'b'   [ '1' | '0' | '_' ] +
              | 'o'   [ oct_digit | '_' ] +
              | 'x'   [ hex_digit | '_' ] +  ] ;
S
Steve Klabnik 已提交
440

441
float_suffix : [ exponent | '.' dec_lit exponent ? ] ? ;
S
Steve Klabnik 已提交
442 443 444

exponent : ['E' | 'e'] ['-' | '+' ] ? dec_lit ;
dec_lit : [ dec_digit | '_' ] + ;
S
Steve Klabnik 已提交
445
```
S
Steve Klabnik 已提交
446 447

A _number literal_ is either an _integer literal_ or a _floating-point
448
literal_. The grammar for recognizing the two kinds of literals is mixed.
S
Steve Klabnik 已提交
449 450 451 452 453 454 455 456

##### Integer literals

An _integer literal_ has one of four forms:

* A _decimal literal_ starts with a *decimal digit* and continues with any
  mixture of *decimal digits* and _underscores_.
* A _hex literal_ starts with the character sequence `U+0030` `U+0078`
D
Daniel Hofstetter 已提交
457
  (`0x`) and continues as any mixture of hex digits and underscores.
S
Steve Klabnik 已提交
458
* An _octal literal_ starts with the character sequence `U+0030` `U+006F`
D
Daniel Hofstetter 已提交
459
  (`0o`) and continues as any mixture of octal digits and underscores.
S
Steve Klabnik 已提交
460
* A _binary literal_ starts with the character sequence `U+0030` `U+0062`
D
Daniel Hofstetter 已提交
461
  (`0b`) and continues as any mixture of binary digits and underscores.
S
Steve Klabnik 已提交
462

463 464 465
Like any literal, an integer literal may be followed (immediately,
without any spaces) by an _integer suffix_, which forcibly sets the
type of the literal. There are 10 valid values for an integer suffix:
S
Steve Klabnik 已提交
466 467 468 469

* Each of the signed and unsigned machine types `u8`, `i8`,
  `u16`, `i16`, `u32`, `i32`, `u64` and `i64`
  give the literal the corresponding machine type.
470 471
* The `is` and `us` suffixes give the literal type `isize` or `usize`,
  respectively.
S
Steve Klabnik 已提交
472 473 474

The type of an _unsuffixed_ integer literal is determined by type inference.
If an integer type can be _uniquely_ determined from the surrounding program
S
Steve Klabnik 已提交
475
context, the unsuffixed integer literal has that type. If the program context
476 477 478
underconstrains the type, it defaults to the signed 32-bit integer `i32`; if
the program context overconstrains the type, it is considered a static type
error.
S
Steve Klabnik 已提交
479 480 481

Examples of integer literals of various forms:

S
Steve Klabnik 已提交
482
```
483 484 485
123i32;                            // type i32
123u32;                            // type u32
123_u32;                           // type u32
S
Steve Klabnik 已提交
486 487 488
0xff_u8;                           // type u8
0o70_i16;                          // type i16
0b1111_1111_1001_0000_i32;         // type i32
489
0us;                               // type usize
S
Steve Klabnik 已提交
490
```
S
Steve Klabnik 已提交
491 492 493 494 495

##### Floating-point literals

A _floating-point literal_ has one of two forms:

496 497
* A _decimal literal_ followed by a period character `U+002E` (`.`). This is
  optionally followed by another decimal literal, with an optional _exponent_.
S
Steve Klabnik 已提交
498 499 500
* A single _decimal literal_ followed by an _exponent_.

By default, a floating-point literal has a generic type, and, like integer
501 502 503
literals, the type must be uniquely determined from the context. There are two valid
_floating-point suffixes_, `f32` and `f64` (the 32-bit and 64-bit floating point
types), which explicitly determine the type of the literal.
S
Steve Klabnik 已提交
504 505 506

Examples of floating-point literals of various forms:

S
Steve Klabnik 已提交
507
```
508 509 510 511 512
123.0f64;        // type f64
0.1f64;          // type f64
0.1f32;          // type f32
12E+99_f64;      // type f64
let x: f64 = 2.; // type f64
S
Steve Klabnik 已提交
513
```
S
Steve Klabnik 已提交
514

515 516 517 518
This last example is different because it is not possible to use the suffix
syntax with a floating point literal ending in a period. `2.f64` would attempt
to call a method named `f64` on `2`.

519
#### Boolean literals
S
Steve Klabnik 已提交
520

J
Jakub Bukaj 已提交
521
The two values of the boolean type are written `true` and `false`.
S
Steve Klabnik 已提交
522 523 524

### Symbols

S
Steve Klabnik 已提交
525
```{.ebnf .gram}
K
kulakowski 已提交
526
symbol : "::" | "->"
S
Steve Klabnik 已提交
527 528
       | '#' | '[' | ']' | '(' | ')' | '{' | '}'
       | ',' | ';' ;
S
Steve Klabnik 已提交
529
```
S
Steve Klabnik 已提交
530 531 532 533 534 535 536 537 538 539

Symbols are a general class of printable [token](#tokens) that play structural
roles in a variety of grammar productions. They are catalogued here for
completeness as the set of remaining miscellaneous printable tokens that do not
otherwise appear as [unary operators](#unary-operator-expressions), [binary
operators](#binary-operator-expressions), or [keywords](#keywords).


## Paths

S
Steve Klabnik 已提交
540
```{.ebnf .gram}
S
Steve Klabnik 已提交
541 542 543 544 545 546 547
expr_path : [ "::" ] ident [ "::" expr_path_tail ] + ;
expr_path_tail : '<' type_expr [ ',' type_expr ] + '>'
               | expr_path ;

type_path : ident [ type_path_tail ] + ;
type_path_tail : '<' type_expr [ ',' type_expr ] + '>'
               | "::" type_path ;
S
Steve Klabnik 已提交
548
```
S
Steve Klabnik 已提交
549 550 551 552 553 554 555 556 557 558 559 560

A _path_ is a sequence of one or more path components _logically_ separated by
a namespace qualifier (`::`). If a path consists of only one component, it may
refer to either an [item](#items) or a [slot](#memory-slots) in a local control
scope. If a path has multiple components, it refers to an item.

Every item has a _canonical path_ within its crate, but the path naming an item
is only meaningful within a given crate. There is no global namespace across
crates; an item's canonical path merely identifies it within the crate.

Two examples of simple paths consisting of only identifier components:

S
Steve Klabnik 已提交
561
```{.ignore}
S
Steve Klabnik 已提交
562 563
x;
x::y::z;
S
Steve Klabnik 已提交
564
```
S
Steve Klabnik 已提交
565 566 567 568 569 570 571 572 573 574

Path components are usually [identifiers](#identifiers), but the trailing
component of a path may be an angle-bracket-enclosed list of type arguments. In
[expression](#expressions) context, the type argument list is given after a
final (`::`) namespace qualifier in order to disambiguate it from a relational
expression involving the less-than symbol (`<`). In type expression context,
the final namespace qualifier is omitted.

Two examples of paths with type arguments:

S
Steve Klabnik 已提交
575
```
S
Steve Klabnik 已提交
576 577 578
# struct HashMap<K, V>;
# fn f() {
# fn id<T>(t: T) -> T { t }
579 580
type T = HashMap<i32,String>; // Type arguments used in a type expression
let x  = id::<i32>(10);       // Type arguments used in a call expression
S
Steve Klabnik 已提交
581
# }
S
Steve Klabnik 已提交
582
```
S
Steve Klabnik 已提交
583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603

Paths can be denoted with various leading qualifiers to change the meaning of
how it is resolved:

* Paths starting with `::` are considered to be global paths where the
  components of the path start being resolved from the crate root. Each
  identifier in the path must resolve to an item.

```rust
mod a {
    pub fn foo() {}
}
mod b {
    pub fn foo() {
        ::a::foo(); // call a's foo function
    }
}
# fn main() {}
```

* Paths starting with the keyword `super` begin resolution relative to the
604
  parent module. Each further identifier must resolve to an item.
S
Steve Klabnik 已提交
605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640

```rust
mod a {
    pub fn foo() {}
}
mod b {
    pub fn foo() {
        super::a::foo(); // call a's foo function
    }
}
# fn main() {}
```

* Paths starting with the keyword `self` begin resolution relative to the
  current module. Each further identifier must resolve to an item.

```rust
fn foo() {}
fn bar() {
    self::foo();
}
# fn main() {}
```

# Syntax extensions

A number of minor features of Rust are not central enough to have their own
syntax, and yet are not implementable as functions. Instead, they are given
names, and invoked through a consistent syntax: `name!(...)`. Examples include:

* `format!` : format data into a string
* `env!` : look up an environment variable's value at compile time
* `file!`: return the path to the file being compiled
* `stringify!` : pretty-print the Rust expression given as an argument
* `include!` : include the Rust expression in the given file
* `include_str!` : include the contents of the given file as a string
C
Chris Wong 已提交
641
* `include_bytes!` : include the contents of the given file as a binary blob
S
Steve Klabnik 已提交
642 643 644 645
* `error!`, `warn!`, `info!`, `debug!` : provide diagnostic information.

All of the above extensions are expressions with values.

646 647
Users of `rustc` can define new syntax extensions in two ways:

S
Steve Klabnik 已提交
648
* [Compiler plugins](book/syntax-extensions.html) can include arbitrary
649 650
  Rust code that manipulates syntax trees at compile time.

S
Steve Klabnik 已提交
651
* [Macros](book/macros.html) define new syntax in a higher-level,
652 653
  declarative way.

S
Steve Klabnik 已提交
654 655
## Macros

S
Steve Klabnik 已提交
656
```{.ebnf .gram}
S
Steve Klabnik 已提交
657 658 659 660 661 662 663 664 665 666
expr_macro_rules : "macro_rules" '!' ident '(' macro_rule * ')' ;
macro_rule : '(' matcher * ')' "=>" '(' transcriber * ')' ';' ;
matcher : '(' matcher * ')' | '[' matcher * ']'
        | '{' matcher * '}' | '$' ident ':' ident
        | '$' '(' matcher * ')' sep_token? [ '*' | '+' ]
        | non_special_token ;
transcriber : '(' transcriber * ')' | '[' transcriber * ']'
            | '{' transcriber * '}' | '$' ident
            | '$' '(' transcriber * ')' sep_token? [ '*' | '+' ]
            | non_special_token ;
S
Steve Klabnik 已提交
667
```
S
Steve Klabnik 已提交
668

K
Keegan McAllister 已提交
669 670 671 672 673
`macro_rules` allows users to define syntax extension in a declarative way.  We
call such extensions "macros by example" or simply "macros" — to be distinguished
from the "procedural macros" defined in [compiler plugins][plugin].

Currently, macros can expand to expressions, statements, items, or patterns.
S
Steve Klabnik 已提交
674

S
Steve Klabnik 已提交
675
(A `sep_token` is any token other than `*` and `+`. A `non_special_token` is
S
Steve Klabnik 已提交
676 677 678
any token other than a delimiter or `$`.)

The macro expander looks up macro invocations by name, and tries each macro
S
Steve Klabnik 已提交
679
rule in turn. It transcribes the first successful match. Matching and
S
Steve Klabnik 已提交
680 681 682 683 684 685
transcription are closely related to each other, and we will describe them
together.

### Macro By Example

The macro expander matches and transcribes every token that does not begin with
S
Steve Klabnik 已提交
686
a `$` literally, including delimiters. For parsing reasons, delimiters must be
S
Steve Klabnik 已提交
687 688 689 690
balanced, but they are otherwise not special.

In the matcher, `$` _name_ `:` _designator_ matches the nonterminal in the Rust
syntax named by _designator_. Valid designators are `item`, `block`, `stmt`,
691 692 693
`pat`, `expr`, `ty` (type), `ident`, `path`, `tt` (either side of the `=>`
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.
S
Steve Klabnik 已提交
694 695

In both the matcher and transcriber, the Kleene star-like operator indicates
S
Steve Klabnik 已提交
696 697 698 699
repetition. The Kleene star operator consists of `$` and parens, optionally
followed by a separator token, followed by `*` or `+`. `*` means zero or more
repetitions, `+` means at least one repetition. The parens are not matched or
transcribed. On the matcher side, a name is bound to _all_ of the names it
S
Steve Klabnik 已提交
700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727
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
out.

The rules for transcription of these repetitions are called "Macro By Example".
Essentially, one "layer" of repetition is discharged at a time, and all of them
must be discharged by the time a name is transcribed. Therefore, `( $( $i:ident
),* ) => ( $i )` is an invalid macro, but `( $( $i:ident ),* ) => ( $( $i:ident
),*  )` is acceptable (if trivial).

When Macro By Example encounters a repetition, it examines all of the `$`
_name_ s that occur in its body. At the "current layer", they all must repeat
the same number of times, so ` ( $( $i:ident ),* ; $( $j:ident ),* ) => ( $(
($i,$j) ),* )` is valid if given the argument `(a,b,c ; d,e,f)`, but not
`(a,b,c ; d,e)`. The repetition walks through the choices at that layer in
lockstep, so the former input transcribes to `( (a,d), (b,e), (c,f) )`.

Nested repetitions are allowed.

### Parsing limitations

The parser used by the macro system is reasonably powerful, but the parsing of
Rust syntax is restricted in two ways:

1. The parser will always parse as much as possible. If it attempts to match
   `$i:expr [ , ]` against `8 [ , ]`, it will attempt to parse `i` as an array
   index operation and fail. Adding a separator can solve this problem.
2. The parser must have eliminated all ambiguity by the time it reaches a `$`
S
Steve Klabnik 已提交
728
   _name_ `:` _designator_. This requirement most often affects name-designator
S
Steve Klabnik 已提交
729 730 731 732 733 734 735 736 737 738 739
   pairs when they occur at the beginning of, or immediately after, a `$(...)*`;
   requiring a distinctive token in front can solve the problem.

## Syntax extensions useful for the macro author

* `log_syntax!` : print out the arguments at compile time
* `trace_macros!` : supply `true` or `false` to enable or disable macro expansion logging
* `stringify!` : turn the identifier argument into a string literal
* `concat!` : concatenates a comma-separated list of literals
* `concat_idents!` : create a new identifier by concatenating the arguments

740 741 742 743 744 745 746 747 748
The following attributes are used for quasiquoting in procedural macros:

* `quote_expr!`
* `quote_item!`
* `quote_pat!`
* `quote_stmt!`
* `quote_tokens!`
* `quote_ty!`

S
Steve Klabnik 已提交
749 750
# Crates and source files

S
Steve Klabnik 已提交
751 752 753 754 755
Rust is a *compiled* language. Its semantics obey a *phase distinction*
between compile-time and run-time. Those semantic rules that have a *static
interpretation* govern the success or failure of compilation. We refer to
these rules as "static semantics". Semantic rules called "dynamic semantics"
govern the behavior of programs at run-time. A program that fails to compile
S
Steve Klabnik 已提交
756 757 758
due to violation of a compile-time rule has no defined dynamic semantics; the
compiler should halt with an error report, and produce no executable artifact.

S
Steve Klabnik 已提交
759
The compilation model centers on artifacts called _crates_. Each compilation
S
Steve Klabnik 已提交
760 761 762 763 764 765 766 767
processes a single crate in source form, and if successful, produces a single
crate in binary form: either an executable or a library.[^cratesourcefile]

[^cratesourcefile]: A crate is somewhat analogous to an *assembly* in the
    ECMA-335 CLI model, a *library* in the SML/NJ Compilation Manager, a *unit*
    in the Owens and Flatt module system, or a *configuration* in Mesa.

A _crate_ is a unit of compilation and linking, as well as versioning,
S
Steve Klabnik 已提交
768 769
distribution and runtime loading. A crate contains a _tree_ of nested
[module](#modules) scopes. The top level of this tree is a module that is
S
Steve Klabnik 已提交
770 771 772 773 774
anonymous (from the point of view of paths within the module) and any item
within a crate has a canonical [module path](#paths) denoting its location
within the crate's module tree.

The Rust compiler is always invoked with a single source file as input, and
S
Steve Klabnik 已提交
775 776
always produces a single output crate. The processing of that source file may
result in other source files being loaded as modules. Source files have the
S
Steve Klabnik 已提交
777 778 779 780 781 782 783 784 785
extension `.rs`.

A Rust source file describes a module, the name and location of which &mdash;
in the module tree of the current crate &mdash; are defined from outside the
source file: either by an explicit `mod_item` in a referencing source file, or
by the name of the crate itself.

Each source file contains a sequence of zero or more `item` definitions, and
may optionally begin with any number of `attributes` that apply to the
S
Steve Klabnik 已提交
786
containing module. Attributes on the anonymous crate module define important
S
Steve Klabnik 已提交
787 788
metadata that influences the behavior of the compiler.

S
Steve Klabnik 已提交
789
```{.rust}
S
Steve Klabnik 已提交
790
# #![allow(unused_attribute)]
791 792
// Crate name
#![crate_name = "projx"]
S
Steve Klabnik 已提交
793 794 795 796 797 798

// Specify the output type
#![crate_type = "lib"]

// Turn on a warning
#![warn(non_camel_case_types)]
S
Steve Klabnik 已提交
799
```
S
Steve Klabnik 已提交
800

S
Steve Klabnik 已提交
801
A crate that contains a `main` function can be compiled to an executable. If a
S
Steve Klabnik 已提交
802 803 804 805 806 807 808 809 810 811
`main` function is present, its return type must be [`unit`](#primitive-types)
and it must take no arguments.

# Items and attributes

Crates contain [items](#items), each of which may have some number of
[attributes](#attributes) attached to it.

## Items

S
Steve Klabnik 已提交
812
```{.ebnf .gram}
813 814 815
item : extern_crate_decl | use_decl | mod_item | fn_item | type_item
     | struct_item | enum_item | static_item | trait_item | impl_item
     | extern_block ;
S
Steve Klabnik 已提交
816
```
S
Steve Klabnik 已提交
817 818 819 820 821 822 823 824 825 826 827 828

An _item_ is a component of a crate; some module items can be defined in crate
files, but most are defined in source files. Items are organized within a crate
by a nested set of [modules](#modules). Every crate has a single "outermost"
anonymous module; all further items within the crate have [paths](#paths)
within the module tree of the crate.

Items are entirely determined at compile-time, generally remain fixed during
execution, and may reside in read-only memory.

There are several kinds of item:

829 830
* [`extern crate` declarations](#extern-crate-declarations)
* [`use` declarations](#use-declarations)
S
Steve Klabnik 已提交
831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846
* [modules](#modules)
* [functions](#functions)
* [type definitions](#type-definitions)
* [structures](#structures)
* [enumerations](#enumerations)
* [static items](#static-items)
* [traits](#traits)
* [implementations](#implementations)

Some items form an implicit scope for the declaration of sub-items. In other
words, within a function or module, declarations of items can (in many cases)
be mixed with the statements, control blocks, and similar artifacts that
otherwise compose the item body. The meaning of these scoped items is the same
as if the item was declared outside the scope &mdash; it is still a static item
&mdash; except that the item's *path name* within the module namespace is
qualified by the name of the enclosing item, or is private to the enclosing
S
Steve Klabnik 已提交
847
item (in the case of functions). The grammar specifies the exact locations in
S
Steve Klabnik 已提交
848 849 850 851 852 853
which sub-item declarations may appear.

### Type Parameters

All items except modules may be *parameterized* by type. Type parameters are
given as a comma-separated list of identifiers enclosed in angle brackets
S
Steve Klabnik 已提交
854
(`<...>`), after the name of the item and before its definition. The type
S
Steve Klabnik 已提交
855
parameters of an item are considered "part of the name", not part of the type
S
Steve Klabnik 已提交
856
of the item. A referencing [path](#paths) must (in principle) provide type
S
Steve Klabnik 已提交
857
arguments as a list of comma-separated types enclosed within angle brackets, in
S
Steve Klabnik 已提交
858 859 860
order to refer to the type-parameterized item. In practice, the type-inference
system can usually infer such argument types from context. There are no
general type-parametric types, only type-parametric items. That is, Rust has
S
Steve Klabnik 已提交
861 862 863 864
no notion of type abstraction: there are no first-class "forall" types.

### Modules

S
Steve Klabnik 已提交
865
```{.ebnf .gram}
S
Steve Klabnik 已提交
866
mod_item : "mod" ident ( ';' | '{' mod '}' );
867
mod : item * ;
S
Steve Klabnik 已提交
868
```
S
Steve Klabnik 已提交
869

870
A module is a container for zero or more [items](#items).
S
Steve Klabnik 已提交
871 872 873 874 875 876 877

A _module item_ is a module, surrounded in braces, named, and prefixed with the
keyword `mod`. A module item introduces a new, named module into the tree of
modules making up a crate. Modules can nest arbitrarily.

An example of a module:

S
Steve Klabnik 已提交
878
```
S
Steve Klabnik 已提交
879 880 881 882
mod math {
    type Complex = (f64, f64);
    fn sin(f: f64) -> f64 {
        /* ... */
S
Steve Klabnik 已提交
883
# panic!();
S
Steve Klabnik 已提交
884 885 886
    }
    fn cos(f: f64) -> f64 {
        /* ... */
S
Steve Klabnik 已提交
887
# panic!();
S
Steve Klabnik 已提交
888 889 890
    }
    fn tan(f: f64) -> f64 {
        /* ... */
S
Steve Klabnik 已提交
891
# panic!();
S
Steve Klabnik 已提交
892 893
    }
}
S
Steve Klabnik 已提交
894
```
S
Steve Klabnik 已提交
895

D
Daniel Hofstetter 已提交
896
Modules and types share the same namespace. Declaring a named type with
S
Steve Klabnik 已提交
897 898 899 900 901
the same name as a module in scope is forbidden: that is, a type definition,
trait, struct, enumeration, or type parameter can't shadow the name of a module
in scope, or vice versa.

A module without a body is loaded from an external file, by default with the
S
Steve Klabnik 已提交
902
same name as the module, plus the `.rs` extension. When a nested submodule is
S
Steve Klabnik 已提交
903 904 905
loaded from an external file, it is loaded from a subdirectory path that
mirrors the module hierarchy.

S
Steve Klabnik 已提交
906
```{.ignore}
S
Steve Klabnik 已提交
907 908 909
// Load the `vec` module from `vec.rs`
mod vec;

S
Steve Klabnik 已提交
910 911
mod thread {
    // Load the `local_data` module from `thread/local_data.rs`
S
Steve Klabnik 已提交
912 913
    mod local_data;
}
S
Steve Klabnik 已提交
914
```
S
Steve Klabnik 已提交
915 916 917 918

The directories and files used for loading external file modules can be
influenced with the `path` attribute.

S
Steve Klabnik 已提交
919
```{.ignore}
S
Steve Klabnik 已提交
920 921 922
#[path = "thread_files"]
mod thread {
    // Load the `local_data` module from `thread_files/tls.rs`
S
Steve Klabnik 已提交
923 924 925
    #[path = "tls.rs"]
    mod local_data;
}
S
Steve Klabnik 已提交
926
```
S
Steve Klabnik 已提交
927 928 929

##### Extern crate declarations

S
Steve Klabnik 已提交
930
```{.ebnf .gram}
S
Steve Klabnik 已提交
931
extern_crate_decl : "extern" "crate" crate_name
932
crate_name: ident | ( string_lit "as" ident )
S
Steve Klabnik 已提交
933
```
S
Steve Klabnik 已提交
934 935 936 937 938 939 940

An _`extern crate` declaration_ specifies a dependency on an external crate.
The external crate is then bound into the declaring scope as the `ident`
provided in the `extern_crate_decl`.

The external crate is resolved to a specific `soname` at compile time, and a
runtime linkage requirement to that `soname` is passed to the linker for
S
Steve Klabnik 已提交
941
loading at runtime. The `soname` is resolved at compile time by scanning the
S
Steve Klabnik 已提交
942 943
compiler's library path and matching the optional `crateid` provided as a
string literal against the `crateid` attributes that were declared on the
S
Steve Klabnik 已提交
944
external crate when it was compiled. If no `crateid` is provided, a default
S
Steve Klabnik 已提交
945 946 947
`name` attribute is assumed, equal to the `ident` given in the
`extern_crate_decl`.

D
Daniel Hofstetter 已提交
948
Three examples of `extern crate` declarations:
S
Steve Klabnik 已提交
949

S
Steve Klabnik 已提交
950
```{.ignore}
S
Steve Klabnik 已提交
951 952 953 954 955
extern crate pcre;

extern crate std; // equivalent to: extern crate std as std;

extern crate "std" as ruststd; // linking to 'std' under another name
S
Steve Klabnik 已提交
956
```
S
Steve Klabnik 已提交
957 958 959

##### Use declarations

S
Steve Klabnik 已提交
960
```{.ebnf .gram}
S
Steve Klabnik 已提交
961 962 963 964 965 966 967
use_decl : "pub" ? "use" [ path "as" ident
                          | path_glob ] ;

path_glob : ident [ "::" [ path_glob
                          | '*' ] ] ?
          | '{' path_item [ ',' path_item ] * '}' ;

968
path_item : ident | "self" ;
S
Steve Klabnik 已提交
969
```
S
Steve Klabnik 已提交
970 971

A _use declaration_ creates one or more local name bindings synonymous with
S
Steve Klabnik 已提交
972
some other [path](#paths). Usually a `use` declaration is used to shorten the
S
Steve Klabnik 已提交
973 974 975 976 977 978 979 980 981
path required to refer to a module item. These declarations may appear at the
top of [modules](#modules) and [blocks](#blocks).

> **Note**: Unlike in many languages,
> `use` declarations in Rust do *not* declare linkage dependency with external crates.
> Rather, [`extern crate` declarations](#extern-crate-declarations) declare linkage dependencies.

Use declarations support a number of convenient shortcuts:

982
* Rebinding the target name as a new local name, using the syntax `use p::q::r as x;`
S
Steve Klabnik 已提交
983 984 985 986 987
* Simultaneously binding a list of paths differing only in their final element,
  using the glob-like brace syntax `use a::b::{c,d,e,f};`
* Binding all paths matching a given prefix, using the asterisk wildcard syntax
  `use a::b::*;`
* Simultaneously binding a list of paths differing only in their final element
988 989
  and their immediate parent module, using the `self` keyword, such as
  `use a::b::{self, c, d};`
S
Steve Klabnik 已提交
990 991 992

An example of `use` declarations:

S
Steve Klabnik 已提交
993
```
S
Steve Klabnik 已提交
994
use std::iter::range_step;
C
Corey Farwell 已提交
995
use std::option::Option::{Some, None};
996
use std::collections::hash_map::{self, HashMap};
S
Steve Klabnik 已提交
997

998
fn foo<T>(_: T){}
999
fn bar(map1: HashMap<String, usize>, map2: hash_map::HashMap<String, usize>){}
S
Steve Klabnik 已提交
1000 1001

fn main() {
1002 1003
    // Equivalent to 'std::iter::range_step(0us, 10, 2);'
    range_step(0us, 10, 2);
S
Steve Klabnik 已提交
1004

C
Corey Farwell 已提交
1005 1006
    // Equivalent to 'foo(vec![std::option::Option::Some(1.0f64),
    // std::option::Option::None]);'
S
Steve Klabnik 已提交
1007 1008
    foo(vec![Some(1.0f64), None]);

1009 1010 1011 1012
    // Both `hash_map` and `HashMap` are in scope.
    let map1 = HashMap::new();
    let map2 = hash_map::HashMap::new();
    bar(map1, map2);
S
Steve Klabnik 已提交
1013
}
S
Steve Klabnik 已提交
1014
```
S
Steve Klabnik 已提交
1015 1016

Like items, `use` declarations are private to the containing module, by
S
Steve Klabnik 已提交
1017 1018
default. Also like items, a `use` declaration can be public, if qualified by
the `pub` keyword. Such a `use` declaration serves to _re-export_ a name. A
S
Steve Klabnik 已提交
1019 1020
public `use` declaration can therefore _redirect_ some public name to a
different target definition: even a definition with a private canonical path,
S
Steve Klabnik 已提交
1021
inside a different module. If a sequence of such redirections form a cycle or
S
Steve Klabnik 已提交
1022 1023 1024 1025
cannot be resolved unambiguously, they represent a compile-time error.

An example of re-exporting:

S
Steve Klabnik 已提交
1026
```
S
Steve Klabnik 已提交
1027 1028 1029 1030 1031 1032 1033 1034 1035
# fn main() { }
mod quux {
    pub use quux::foo::{bar, baz};

    pub mod foo {
        pub fn bar() { }
        pub fn baz() { }
    }
}
S
Steve Klabnik 已提交
1036
```
S
Steve Klabnik 已提交
1037 1038 1039 1040 1041

In this example, the module `quux` re-exports two public names defined in
`foo`.

Also note that the paths contained in `use` items are relative to the crate
S
Steve Klabnik 已提交
1042 1043
root. So, in the previous example, the `use` refers to `quux::foo::{bar,
baz}`, and not simply to `foo::{bar, baz}`. This also means that top-level
S
Steve Klabnik 已提交
1044
module declarations should be at the crate root if direct usage of the declared
S
Steve Klabnik 已提交
1045
modules within `use` items is desired. It is also possible to use `self` and
S
Steve Klabnik 已提交
1046
`super` at the beginning of a `use` item to refer to the current and direct
S
Steve Klabnik 已提交
1047
parent modules respectively. All rules regarding accessing declared modules in
S
Steve Klabnik 已提交
1048 1049 1050 1051 1052
`use` declarations applies to both module declarations and `extern crate`
declarations.

An example of what will and will not work for `use` items:

S
Steve Klabnik 已提交
1053
```
S
Steve Klabnik 已提交
1054
# #![allow(unused_imports)]
1055
use foo::core::iter;  // good: foo is at the root of the crate
S
Steve Klabnik 已提交
1056 1057 1058
use foo::baz::foobaz;    // good: foo is at the root of the crate

mod foo {
1059
    extern crate core;
S
Steve Klabnik 已提交
1060

1061
    use foo::core::iter; // good: foo is at crate root
1062
//  use core::iter;      // bad:  core is not at the crate root
S
Steve Klabnik 已提交
1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076
    use self::baz::foobaz;  // good: self refers to module 'foo'
    use foo::bar::foobar;   // good: foo is at crate root

    pub mod bar {
        pub fn foobar() { }
    }

    pub mod baz {
        use super::bar::foobar; // good: super refers to module 'foo'
        pub fn foobaz() { }
    }
}

fn main() {}
S
Steve Klabnik 已提交
1077
```
S
Steve Klabnik 已提交
1078 1079 1080 1081 1082

### Functions

A _function item_ defines a sequence of [statements](#statements) and an
optional final [expression](#expressions), along with a name and a set of
S
Steve Klabnik 已提交
1083
parameters. Functions are declared with the keyword `fn`. Functions declare a
S
Steve Klabnik 已提交
1084 1085 1086 1087
set of *input* [*slots*](#memory-slots) as parameters, through which the caller
passes arguments into the function, and an *output* [*slot*](#memory-slots)
through which the function passes results back to the caller.

1088
A function may also be copied into a first-class *value*, in which case the
S
Steve Klabnik 已提交
1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099
value has the corresponding [*function type*](#function-types), and can be used
otherwise exactly as a function item (with a minor additional cost of calling
the function indirectly).

Every control path in a function logically ends with a `return` expression or a
diverging expression. If the outermost block of a function has a
value-producing expression in its final-expression position, that expression is
interpreted as an implicit `return` expression applied to the final-expression.

An example of a function:

S
Steve Klabnik 已提交
1100
```
1101
fn add(x: i32, y: i32) -> i32 {
S
Steve Klabnik 已提交
1102 1103
    return x + y;
}
S
Steve Klabnik 已提交
1104
```
S
Steve Klabnik 已提交
1105 1106 1107 1108

As with `let` bindings, function arguments are irrefutable patterns, so any
pattern that is valid in a let binding is also valid as an argument.

S
Steve Klabnik 已提交
1109
```
1110
fn first((value, _): (i32, i32)) -> i32 { value }
S
Steve Klabnik 已提交
1111
```
S
Steve Klabnik 已提交
1112 1113 1114 1115 1116 1117 1118 1119


#### Generic functions

A _generic function_ allows one or more _parameterized types_ to appear in its
signature. Each type parameter must be explicitly declared, in an
angle-bracket-enclosed, comma-separated list following the function name.

S
Steve Klabnik 已提交
1120
```{.ignore}
S
Steve Klabnik 已提交
1121 1122 1123 1124 1125 1126 1127 1128
fn iter<T>(seq: &[T], f: |T|) {
    for elt in seq.iter() { f(elt); }
}
fn map<T, U>(seq: &[T], f: |T| -> U) -> Vec<U> {
    let mut acc = vec![];
    for elt in seq.iter() { acc.push(f(elt)); }
    acc
}
S
Steve Klabnik 已提交
1129
```
S
Steve Klabnik 已提交
1130 1131 1132 1133 1134 1135

Inside the function signature and body, the name of the type parameter can be
used as a type name.

When a generic function is referenced, its type is instantiated based on the
context of the reference. For example, calling the `iter` function defined
1136 1137
above on `[1, 2]` will instantiate type parameter `T` with `i32`, and require
the closure parameter to have type `fn(i32)`.
S
Steve Klabnik 已提交
1138 1139 1140 1141 1142 1143 1144 1145 1146 1147

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.

S
Steve Klabnik 已提交
1148
```
S
Steve Klabnik 已提交
1149
fn id<T>(x: T) -> T { x }
S
Steve Klabnik 已提交
1150
```
S
Steve Klabnik 已提交
1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169

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
guarantees of Rust's static semantics.

The following language level features cannot be used in the safe subset of
Rust:

- Dereferencing a [raw pointer](#pointer-types).
- Reading or writing a [mutable static variable](#mutable-statics).
- Calling an unsafe function (including an intrinsic or foreign function).

##### Unsafe functions

Unsafe functions are functions that are not safe in all contexts and/or for all
1170 1171
possible inputs. Such a function must be prefixed with the keyword `unsafe` and
can only be called from an `unsafe` block or another `unsafe` function.
S
Steve Klabnik 已提交
1172 1173 1174

##### Unsafe blocks

1175 1176
A block of code can be prefixed with the `unsafe` keyword, to permit calling
`unsafe` functions or dereferencing raw pointers within a safe function.
S
Steve Klabnik 已提交
1177 1178 1179 1180 1181 1182 1183 1184 1185

When a programmer has sufficient conviction that a sequence of potentially
unsafe operations is actually safe, they can encapsulate that sequence (taken
as a whole) within an `unsafe` block. The compiler will consider uses of such
code safe, in the surrounding context.

Unsafe blocks are used to wrap foreign libraries, make direct use of hardware
or implement features not directly present in the language. For example, Rust
provides the language features necessary to implement memory-safe concurrency
S
Steve Klabnik 已提交
1186
in the language but the implementation of threads and message passing is in the
S
Steve Klabnik 已提交
1187 1188 1189 1190 1191
standard library.

Rust's type system is a conservative approximation of the dynamic safety
requirements, so in some cases there is a performance cost to using safe code.
For example, a doubly-linked list is not a tree structure and can only be
S
Steve Klabnik 已提交
1192 1193 1194
represented with reference-counted pointers in safe code. By using `unsafe`
blocks to represent the reverse links as raw pointers, it can be implemented
with only boxes.
S
Steve Klabnik 已提交
1195

1196
##### Behavior considered undefined
S
Steve Klabnik 已提交
1197

1198 1199 1200
The following is a list of behavior which is forbidden in all Rust code,
including within `unsafe` blocks and `unsafe` functions. Type checking provides
the guarantee that these issues are never caused by safe code.
S
Steve Klabnik 已提交
1201 1202 1203

* Data races
* Dereferencing a null/dangling raw pointer
1204
* Mutating an immutable value/reference without `UnsafeCell`
S
Steve Klabnik 已提交
1205 1206 1207 1208 1209 1210 1211 1212 1213 1214
* Reads of [undef](http://llvm.org/docs/LangRef.html#undefined-values)
  (uninitialized) memory
* Breaking the [pointer aliasing
  rules](http://llvm.org/docs/LangRef.html#pointer-aliasing-rules)
  with raw pointers (a subset of the rules used by C)
* Invoking undefined behavior via compiler intrinsics:
  * Indexing outside of the bounds of an object with `std::ptr::offset`
    (`offset` intrinsic), with
    the exception of one byte past the end which is permitted.
  * Using `std::ptr::copy_nonoverlapping_memory` (`memcpy32`/`memcpy64`
J
Joseph Crail 已提交
1215
    intrinsics) on overlapping buffers
S
Steve Klabnik 已提交
1216
* Invalid values in primitive types, even in private fields/locals:
1217
  * Dangling/null references or boxes
S
Steve Klabnik 已提交
1218 1219 1220
  * A value other than `false` (0) or `true` (1) in a `bool`
  * A discriminant in an `enum` not included in the type definition
  * A value in a `char` which is a surrogate or above `char::MAX`
1221
  * Non-UTF-8 byte sequences in a `str`
1222 1223 1224
* Unwinding into Rust from foreign code or unwinding from Rust into foreign
  code. Rust's failure system is not compatible with exception handling in
  other languages. Unwinding must be caught and handled at FFI boundaries.
S
Steve Klabnik 已提交
1225 1226 1227 1228 1229 1230 1231

##### Behaviour not considered unsafe

This is a list of behaviour not considered *unsafe* in Rust terms, but that may
be undesired.

* Deadlocks
L
Luqman Aden 已提交
1232
* Reading data from private fields (`std::repr`)
S
Steve Klabnik 已提交
1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245
* Leaks due to reference count cycles, even in the global heap
* Exiting without calling destructors
* Sending signals
* Accessing/modifying the file system
* Unsigned integer overflow (well-defined as wrapping)
* Signed integer overflow (well-defined as two's complement representation
  wrapping)

#### Diverging functions

A special kind of function can be declared with a `!` character where the
output slot type would normally be. For example:

S
Steve Klabnik 已提交
1246
```
S
Steve Klabnik 已提交
1247 1248
fn my_err(s: &str) -> ! {
    println!("{}", s);
S
Steve Klabnik 已提交
1249
    panic!();
S
Steve Klabnik 已提交
1250
}
S
Steve Klabnik 已提交
1251
```
S
Steve Klabnik 已提交
1252 1253

We call such functions "diverging" because they never return a value to the
S
Steve Klabnik 已提交
1254
caller. Every control path in a diverging function must end with a `panic!()` or
S
Steve Klabnik 已提交
1255 1256
a call to another diverging function on every control path. The `!` annotation
does *not* denote a type. Rather, the result type of a diverging function is a
T
th0114nd 已提交
1257 1258
special type called ⊥ ("bottom") that unifies with any type. Rust has no
syntax for ⊥.
S
Steve Klabnik 已提交
1259 1260 1261 1262 1263 1264 1265

It might be necessary to declare a diverging function because as mentioned
previously, the typechecker checks that every control path in a function ends
with a [`return`](#return-expressions) or diverging expression. So, if `my_err`
were declared without the `!` annotation, the following code would not
typecheck:

S
Steve Klabnik 已提交
1266
```
S
Steve Klabnik 已提交
1267
# fn my_err(s: &str) -> ! { panic!() }
S
Steve Klabnik 已提交
1268

1269
fn f(i: i32) -> i32 {
S
Steve Klabnik 已提交
1270 1271 1272 1273 1274 1275 1276
   if i == 42 {
     return 42;
   }
   else {
     my_err("Bad number!");
   }
}
S
Steve Klabnik 已提交
1277
```
S
Steve Klabnik 已提交
1278 1279

This will not compile without the `!` annotation on `my_err`, since the `else`
1280
branch of the conditional in `f` does not return an `i32`, as required by the
S
Steve Klabnik 已提交
1281
signature of `f`. Adding the `!` annotation to `my_err` informs the
S
Steve Klabnik 已提交
1282 1283
typechecker that, should control ever enter `my_err`, no further type judgments
about `f` need to hold, since control will never resume in any context that
S
Steve Klabnik 已提交
1284
relies on those judgments. Thus the return type on `f` only needs to reflect
S
Steve Klabnik 已提交
1285 1286 1287 1288 1289
the `if` branch of the conditional.

#### Extern functions

Extern functions are part of Rust's foreign function interface, providing the
S
Steve Klabnik 已提交
1290
opposite functionality to [external blocks](#external-blocks). Whereas
S
Steve Klabnik 已提交
1291 1292 1293 1294 1295
external blocks allow Rust code to call foreign code, extern functions with
bodies defined in Rust code _can be called by foreign code_. They are defined
in the same way as any other Rust function, except that they have the `extern`
modifier.

S
Steve Klabnik 已提交
1296
```
S
Steve Klabnik 已提交
1297
// Declares an extern fn, the ABI defaults to "C"
1298
extern fn new_i32() -> i32 { 0 }
S
Steve Klabnik 已提交
1299 1300

// Declares an extern fn with "stdcall" ABI
1301
extern "stdcall" fn new_i32_stdcall() -> i32 { 0 }
S
Steve Klabnik 已提交
1302
```
S
Steve Klabnik 已提交
1303

S
Steve Klabnik 已提交
1304
Unlike normal functions, extern fns have an `extern "ABI" fn()`. This is the
S
Steve Klabnik 已提交
1305 1306
same type as the functions declared in an extern block.

S
Steve Klabnik 已提交
1307
```
1308 1309
# extern fn new_i32() -> i32 { 0 }
let fptr: extern "C" fn() -> i32 = new_i32;
S
Steve Klabnik 已提交
1310
```
S
Steve Klabnik 已提交
1311 1312 1313 1314

Extern functions may be called directly from Rust code as Rust uses large,
contiguous stack segments like C.

1315
### Type aliases
S
Steve Klabnik 已提交
1316

1317 1318
A _type alias_ defines a new name for an existing [type](#types). Type
aliases are declared with the keyword `type`. Every value has a single,
S
Steve Klabnik 已提交
1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329
specific type; the type-specified aspects of a value include:

* Whether the value is composed of sub-values or is indivisible.
* Whether the value represents textual or numerical information.
* Whether the value represents integral or floating-point information.
* The sequence of memory operations required to access the value.
* The [kind](#type-kinds) of the type.

For example, the type `(u8, u8)` defines the set of immutable values that are
composite pairs, each containing two unsigned 8-bit integers accessed by
pattern-matching and laid out in memory with the `x` component preceding the
1330 1331 1332 1333 1334 1335
`y` component:

```
type Point = (u8, u8);
let p: Point = (41, 68);
```
S
Steve Klabnik 已提交
1336 1337 1338 1339 1340 1341 1342 1343

### Structures

A _structure_ is a nominal [structure type](#structure-types) defined with the
keyword `struct`.

An example of a `struct` item and its use:

S
Steve Klabnik 已提交
1344
```
1345
struct Point {x: i32, y: i32}
S
Steve Klabnik 已提交
1346
let p = Point {x: 10, y: 11};
1347
let px: i32 = p.x;
S
Steve Klabnik 已提交
1348
```
S
Steve Klabnik 已提交
1349 1350

A _tuple structure_ is a nominal [tuple type](#tuple-types), also defined with
S
Steve Klabnik 已提交
1351
the keyword `struct`. For example:
S
Steve Klabnik 已提交
1352

S
Steve Klabnik 已提交
1353
```
1354
struct Point(i32, i32);
S
Steve Klabnik 已提交
1355
let p = Point(10, 11);
1356
let px: i32 = match p { Point(x, _) => x };
S
Steve Klabnik 已提交
1357
```
S
Steve Klabnik 已提交
1358 1359

A _unit-like struct_ is a structure without any fields, defined by leaving off
S
Steve Klabnik 已提交
1360 1361
the list of fields entirely. Such types will have a single value, just like
the [unit value `()`](#unit-and-boolean-literals) of the unit type. For
S
Steve Klabnik 已提交
1362 1363
example:

S
Steve Klabnik 已提交
1364
```
S
Steve Klabnik 已提交
1365 1366
struct Cookie;
let c = [Cookie, Cookie, Cookie, Cookie];
S
Steve Klabnik 已提交
1367
```
S
Steve Klabnik 已提交
1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381

The precise memory layout of a structure is not specified. One can specify a
particular layout using the [`repr` attribute](#ffi-attributes).

### Enumerations

An _enumeration_ is a simultaneous definition of a nominal [enumerated
type](#enumerated-types) as well as a set of *constructors*, that can be used
to create or pattern-match values of the corresponding enumerated type.

Enumerations are declared with the keyword `enum`.

An example of an `enum` item and its use:

S
Steve Klabnik 已提交
1382
```
S
Steve Klabnik 已提交
1383 1384 1385 1386 1387
enum Animal {
  Dog,
  Cat
}

S
Steven Fackler 已提交
1388 1389
let mut a: Animal = Animal::Dog;
a = Animal::Cat;
S
Steve Klabnik 已提交
1390
```
S
Steve Klabnik 已提交
1391 1392 1393

Enumeration constructors can have either named or unnamed fields:

S
Steve Klabnik 已提交
1394
```
S
Steve Klabnik 已提交
1395 1396 1397 1398 1399 1400 1401
# #![feature(struct_variant)]
# fn main() {
enum Animal {
    Dog (String, f64),
    Cat { name: String, weight: f64 }
}

S
Steven Fackler 已提交
1402 1403
let mut a: Animal = Animal::Dog("Cocoa".to_string(), 37.2);
a = Animal::Cat { name: "Spotty".to_string(), weight: 2.7 };
S
Steve Klabnik 已提交
1404
# }
S
Steve Klabnik 已提交
1405
```
S
Steve Klabnik 已提交
1406 1407 1408 1409

In this example, `Cat` is a _struct-like enum variant_,
whereas `Dog` is simply called an enum variant.

1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430
Enums have a discriminant. You can assign them explicitly:

```
enum Foo {
    Bar = 123,
}
```

If a discriminant isn't assigned, they start at zero, and add one for each
variant, in order.

You can cast an enum to get this value:

```
# enum Foo { Bar = 123 }
let x = Foo::Bar as u32; // x is now 123u32
```

This only works as long as none of the variants have data attached. If
it were `Bar(i32)`, this is disallowed.

1431
### Constant items
S
Steve Klabnik 已提交
1432

S
Steve Klabnik 已提交
1433
```{.ebnf .gram}
1434
const_item : "const" ident ':' type '=' expr ';' ;
S
Steve Klabnik 已提交
1435
```
S
Steve Klabnik 已提交
1436

1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447
A *constant item* is a named _constant value_ which is not associated with a
specific memory location in the program. Constants are essentially inlined
wherever they are used, meaning that they are copied directly into the relevant
context when used. References to the same constant are not necessarily
guaranteed to refer to the same memory address.

Constant values must not have destructors, and otherwise permit most forms of
data. Constants may refer to the address of other constants, in which case the
address will have the `static` lifetime. The compiler is, however, still at
liberty to translate the constant many times, so the address referred to may not
be stable.
S
Steve Klabnik 已提交
1448

1449 1450 1451
Constants must be explicitly typed. The type may be `bool`, `char`, a number, or
a type derived from those primitive types. The derived types are references with
the `static` lifetime, fixed-size arrays, tuples, enum variants, and structs.
S
Steve Klabnik 已提交
1452

S
Steve Klabnik 已提交
1453
```
1454 1455
const BIT1: u32 = 1 << 0;
const BIT2: u32 = 1 << 1;
S
Steve Klabnik 已提交
1456

1457
const BITS: [u32; 2] = [BIT1, BIT2];
1458
const STRING: &'static str = "bitstring";
S
Steve Klabnik 已提交
1459 1460

struct BitsNStrings<'a> {
1461
    mybits: [u32; 2],
S
Steve Klabnik 已提交
1462 1463 1464
    mystring: &'a str
}

1465
const BITS_N_STRINGS: BitsNStrings<'static> = BitsNStrings {
S
Steve Klabnik 已提交
1466 1467 1468
    mybits: BITS,
    mystring: STRING
};
S
Steve Klabnik 已提交
1469
```
S
Steve Klabnik 已提交
1470

1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496
### Static items

```{.ebnf .gram}
static_item : "static" ident ':' type '=' expr ';' ;
```

A *static item* is similar to a *constant*, except that it represents a precise
memory location in the program. A static is never "inlined" at the usage site,
and all references to it refer to the same memory location. Static items have
the `static` lifetime, which outlives all other lifetimes in a Rust program.
Static items may be placed in read-only memory if they do not contain any
interior mutability.

Statics may contain interior mutability through the `UnsafeCell` language item.
All access to a static is safe, but there are a number of restrictions on
statics:

* Statics may not contain any destructors.
* The types of static values must ascribe to `Sync` to allow threadsafe access.
* Statics may not refer to other statics by value, only by reference.
* Constants cannot refer to statics.

Constants should in general be preferred over statics, unless large amounts of
data are being stored, or single-address and mutability properties are required.

```
A
Alex Crichton 已提交
1497
use std::sync::atomic::{AtomicUsize, Ordering, ATOMIC_USIZE_INIT};
1498

1499
// Note that ATOMIC_USIZE_INIT is a *const*, but it may be used to initialize a
1500
// static. This static can be modified, so it is not placed in read-only memory.
A
Alex Crichton 已提交
1501
static COUNTER: AtomicUsize = ATOMIC_USIZE_INIT;
1502 1503

// This table is a candidate to be placed in read-only memory.
1504
static TABLE: &'static [usize] = &[1, 2, 3, /* ... */];
1505 1506 1507 1508

for slot in TABLE.iter() {
    println!("{}", slot);
}
A
Alex Crichton 已提交
1509
COUNTER.fetch_add(1, Ordering::SeqCst);
1510 1511
```

S
Steve Klabnik 已提交
1512 1513
#### Mutable statics

S
Steve Klabnik 已提交
1514
If a static item is declared with the `mut` keyword, then it is allowed to
S
Steve Klabnik 已提交
1515 1516
be modified by the program. One of Rust's goals is to make concurrency bugs
hard to run into, and this is obviously a very large source of race conditions
S
Steve Klabnik 已提交
1517
or other bugs. For this reason, an `unsafe` block is required when either
S
Steve Klabnik 已提交
1518
reading or writing a mutable static variable. Care should be taken to ensure
S
Steve Klabnik 已提交
1519
that modifications to a mutable static are safe with respect to other threads
S
Steve Klabnik 已提交
1520 1521 1522
running in the same process.

Mutable statics are still very useful, however. They can be used with C
S
Steve Klabnik 已提交
1523
libraries and can also be bound from C libraries (in an `extern` block).
S
Steve Klabnik 已提交
1524

S
Steve Klabnik 已提交
1525
```
1526
# fn atomic_add(_: &mut u32, _: u32) -> u32 { 2 }
S
Steve Klabnik 已提交
1527

1528
static mut LEVELS: u32 = 0;
S
Steve Klabnik 已提交
1529 1530 1531

// This violates the idea of no shared state, and this doesn't internally
// protect against races, so this function is `unsafe`
1532
unsafe fn bump_levels_unsafe1() -> u32 {
S
Steve Klabnik 已提交
1533 1534 1535 1536 1537 1538 1539 1540
    let ret = LEVELS;
    LEVELS += 1;
    return ret;
}

// Assuming that we have an atomic_add function which returns the old value,
// this function is "safe" but the meaning of the return value may not be what
// callers expect, so it's still marked as `unsafe`
1541
unsafe fn bump_levels_unsafe2() -> u32 {
S
Steve Klabnik 已提交
1542 1543
    return atomic_add(&mut LEVELS, 1);
}
S
Steve Klabnik 已提交
1544
```
S
Steve Klabnik 已提交
1545

1546 1547 1548
Mutable statics have the same restrictions as normal statics, except that the
type of the value is not required to ascribe to `Sync`.

S
Steve Klabnik 已提交
1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559
### Traits

A _trait_ describes a set of method types.

Traits can include default implementations of methods, written in terms of some
unknown [`self` type](#self-types); the `self` type may either be completely
unspecified, or constrained by some other trait.

Traits are implemented for specific types through separate
[implementations](#implementations).

S
Steve Klabnik 已提交
1560
```
1561 1562
# type Surface = i32;
# type BoundingBox = i32;
S
Steve Klabnik 已提交
1563 1564 1565 1566
trait Shape {
    fn draw(&self, Surface);
    fn bounding_box(&self) -> BoundingBox;
}
S
Steve Klabnik 已提交
1567
```
S
Steve Klabnik 已提交
1568

S
Steve Klabnik 已提交
1569
This defines a trait with two methods. All values that have
S
Steve Klabnik 已提交
1570 1571 1572 1573
[implementations](#implementations) of this trait in scope can have their
`draw` and `bounding_box` methods called, using `value.bounding_box()`
[syntax](#method-call-expressions).

S
Steve Klabnik 已提交
1574
Type parameters can be specified for a trait to make it generic. These appear
S
Steve Klabnik 已提交
1575 1576 1577
after the trait name, using the same syntax used in [generic
functions](#generic-functions).

1578
```
S
Steve Klabnik 已提交
1579
trait Seq<T> {
1580 1581
   fn len(&self) -> u32;
   fn elt_at(&self, n: u32) -> T;
1582
   fn iter<F>(&self, F) where F: Fn(T);
S
Steve Klabnik 已提交
1583
}
S
Steve Klabnik 已提交
1584
```
S
Steve Klabnik 已提交
1585

S
Steve Klabnik 已提交
1586
Generic functions may use traits as _bounds_ on their type parameters. This
S
Steve Klabnik 已提交
1587 1588
will have two effects: only types that have the trait may instantiate the
parameter, and within the generic function, the methods of the trait can be
S
Steve Klabnik 已提交
1589
called on values that have the parameter's type. For example:
S
Steve Klabnik 已提交
1590

S
Steve Klabnik 已提交
1591
```
1592
# type Surface = i32;
S
Steve Klabnik 已提交
1593 1594 1595 1596 1597
# trait Shape { fn draw(&self, Surface); }
fn draw_twice<T: Shape>(surface: Surface, sh: T) {
    sh.draw(surface);
    sh.draw(surface);
}
S
Steve Klabnik 已提交
1598
```
S
Steve Klabnik 已提交
1599 1600

Traits also define an [object type](#object-types) with the same name as the
S
Steve Klabnik 已提交
1601
trait. Values of this type are created by [casting](#type-cast-expressions)
S
Steve Klabnik 已提交
1602 1603 1604
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.

S
Steve Klabnik 已提交
1605
```
S
Steve Klabnik 已提交
1606
# trait Shape { }
1607 1608
# impl Shape for i32 { }
# let mycircle = 0i32;
A
Alex Crichton 已提交
1609
let myshape: Box<Shape> = Box::new(mycircle) as Box<Shape>;
S
Steve Klabnik 已提交
1610
```
S
Steve Klabnik 已提交
1611 1612 1613 1614 1615 1616 1617 1618 1619

The resulting value is a box containing the value that was cast, along with
information that identifies the methods of the implementation that was used.
Values with a trait type can have [methods called](#method-call-expressions) on
them, for any method in the trait, and can be used to instantiate type
parameters that are bounded by the trait.

Trait methods may be static, which means that they lack a `self` argument.
This means that they can only be called with function call syntax (`f(x)`) and
S
Steve Klabnik 已提交
1620
not method call syntax (`obj.f()`). The way to refer to the name of a static
S
Steve Klabnik 已提交
1621 1622 1623
method is to qualify it with the trait name, treating the trait name like a
module. For example:

S
Steve Klabnik 已提交
1624
```
S
Steve Klabnik 已提交
1625
trait Num {
1626
    fn from_i32(n: i32) -> Self;
S
Steve Klabnik 已提交
1627 1628
}
impl Num for f64 {
1629
    fn from_i32(n: i32) -> f64 { n as f64 }
S
Steve Klabnik 已提交
1630
}
1631
let x: f64 = Num::from_i32(42);
S
Steve Klabnik 已提交
1632
```
S
Steve Klabnik 已提交
1633 1634 1635

Traits may inherit from other traits. For example, in

S
Steve Klabnik 已提交
1636
```
S
Steve Klabnik 已提交
1637 1638
trait Shape { fn area() -> f64; }
trait Circle : Shape { fn radius() -> f64; }
S
Steve Klabnik 已提交
1639
```
S
Steve Klabnik 已提交
1640 1641

the syntax `Circle : Shape` means that types that implement `Circle` must also
S
Steve Klabnik 已提交
1642 1643
have an implementation for `Shape`. Multiple supertraits are separated by `+`,
`trait Circle : Shape + PartialEq { }`. In an implementation of `Circle` for a
S
Steve Klabnik 已提交
1644 1645 1646 1647 1648
given type `T`, methods can refer to `Shape` methods, since the typechecker
checks that any type with an implementation of `Circle` also has an
implementation of `Shape`.

In type-parameterized functions, methods of the supertrait may be called on
S
Steve Klabnik 已提交
1649
values of subtrait-bound type parameters. Referring to the previous example of
S
Steve Klabnik 已提交
1650 1651
`trait Circle : Shape`:

S
Steve Klabnik 已提交
1652
```
S
Steve Klabnik 已提交
1653 1654 1655 1656 1657 1658
# trait Shape { fn area(&self) -> f64; }
# trait Circle : Shape { fn radius(&self) -> f64; }
fn radius_times_area<T: Circle>(c: T) -> f64 {
    // `c` is both a Circle and a Shape
    c.radius() * c.area()
}
S
Steve Klabnik 已提交
1659
```
S
Steve Klabnik 已提交
1660 1661 1662

Likewise, supertrait methods may also be called on trait objects.

S
Steve Klabnik 已提交
1663
```{.ignore}
S
Steve Klabnik 已提交
1664 1665
# trait Shape { fn area(&self) -> f64; }
# trait Circle : Shape { fn radius(&self) -> f64; }
1666 1667 1668
# impl Shape for i32 { fn area(&self) -> f64 { 0.0 } }
# impl Circle for i32 { fn radius(&self) -> f64 { 0.0 } }
# let mycircle = 0i32;
A
Alex Crichton 已提交
1669
let mycircle = Box::new(mycircle) as Box<Circle>;
S
Steve Klabnik 已提交
1670
let nonsense = mycircle.radius() * mycircle.area();
S
Steve Klabnik 已提交
1671
```
S
Steve Klabnik 已提交
1672 1673 1674 1675 1676 1677 1678 1679

### Implementations

An _implementation_ is an item that implements a [trait](#traits) for a
specific type.

Implementations are defined with the keyword `impl`.

S
Steve Klabnik 已提交
1680
```
1681
# #[derive(Copy)]
S
Steve Klabnik 已提交
1682
# struct Point {x: f64, y: f64};
1683
# type Surface = i32;
S
Steve Klabnik 已提交
1684 1685 1686 1687 1688 1689 1690 1691
# struct BoundingBox {x: f64, y: f64, width: f64, height: f64};
# trait Shape { fn draw(&self, Surface); fn bounding_box(&self) -> BoundingBox; }
# fn do_draw_circle(s: Surface, c: Circle) { }
struct Circle {
    radius: f64,
    center: Point,
}

N
Niko Matsakis 已提交
1692 1693
impl Copy for Circle {}

S
Steve Klabnik 已提交
1694 1695 1696 1697 1698 1699 1700 1701
impl Shape for Circle {
    fn draw(&self, s: Surface) { do_draw_circle(s, *self); }
    fn bounding_box(&self) -> BoundingBox {
        let r = self.radius;
        BoundingBox{x: self.center.x - r, y: self.center.y - r,
         width: 2.0 * r, height: 2.0 * r}
    }
}
S
Steve Klabnik 已提交
1702
```
S
Steve Klabnik 已提交
1703

S
Steve Klabnik 已提交
1704
It is possible to define an implementation without referring to a trait. The
S
Steve Klabnik 已提交
1705
methods in such an implementation can only be used as direct calls on the
S
Steve Klabnik 已提交
1706 1707
values of the type that the implementation targets. In such an implementation,
the trait type and `for` after `impl` are omitted. Such implementations are
S
Steve Klabnik 已提交
1708
limited to nominal types (enums, structs), and the implementation must appear
1709 1710 1711
in the same module or a sub-module as the `self` type:

```
1712
struct Point {x: i32, y: i32}
1713 1714 1715 1716 1717 1718 1719 1720 1721 1722

impl Point {
    fn log(&self) {
        println!("Point is at ({}, {})", self.x, self.y);
    }
}

let my_point = Point {x: 10, y:11};
my_point.log();
```
S
Steve Klabnik 已提交
1723 1724 1725 1726 1727

When a trait _is_ specified in an `impl`, all methods declared as part of the
trait must be implemented, with matching types and type parameter counts.

An implementation can take type parameters, which can be different from the
S
Steve Klabnik 已提交
1728
type parameters taken by the trait it implements. Implementation parameters
S
Steve Klabnik 已提交
1729 1730
are written after the `impl` keyword.

S
Steve Klabnik 已提交
1731
```
S
Steve Klabnik 已提交
1732 1733 1734 1735 1736 1737 1738
# trait Seq<T> { }
impl<T> Seq<T> for Vec<T> {
   /* ... */
}
impl Seq<bool> for u32 {
   /* Treat the integer as a sequence of bits */
}
S
Steve Klabnik 已提交
1739
```
S
Steve Klabnik 已提交
1740 1741 1742

### External blocks

S
Steve Klabnik 已提交
1743
```{.ebnf .gram}
S
Steve Klabnik 已提交
1744 1745
extern_block_item : "extern" '{' extern_block '}' ;
extern_block : [ foreign_fn ] * ;
S
Steve Klabnik 已提交
1746
```
S
Steve Klabnik 已提交
1747 1748 1749 1750 1751 1752 1753 1754 1755

External blocks form the basis for Rust's foreign function interface.
Declarations in an external block describe symbols in external, non-Rust
libraries.

Functions within external blocks are declared in the same way as other Rust
functions, with the exception that they may not have a body and are instead
terminated by a semicolon.

S
Steve Klabnik 已提交
1756
```
S
Steve Klabnik 已提交
1757 1758 1759 1760 1761 1762 1763
extern crate libc;
use libc::{c_char, FILE};

extern {
    fn fopen(filename: *const c_char, mode: *const c_char) -> *mut FILE;
}
# fn main() {}
S
Steve Klabnik 已提交
1764
```
S
Steve Klabnik 已提交
1765 1766

Functions within external blocks may be called by Rust code, just like
S
Steve Klabnik 已提交
1767
functions defined in Rust. The Rust compiler automatically translates between
S
Steve Klabnik 已提交
1768 1769 1770 1771 1772
the Rust ABI and the foreign ABI.

A number of [attributes](#attributes) control the behavior of external blocks.

By default external blocks assume that the library they are calling uses the
S
Steve Klabnik 已提交
1773
standard C "cdecl" ABI. Other ABIs may be specified using an `abi` string, as
S
Steve Klabnik 已提交
1774 1775
shown here:

S
Steve Klabnik 已提交
1776
```{.ignore}
S
Steve Klabnik 已提交
1777 1778
// Interface to the Windows API
extern "stdcall" { }
S
Steve Klabnik 已提交
1779
```
S
Steve Klabnik 已提交
1780 1781 1782 1783 1784

The `link` attribute allows the name of the library to be specified. When
specified the compiler will attempt to link against the native library of the
specified name.

S
Steve Klabnik 已提交
1785
```{.ignore}
S
Steve Klabnik 已提交
1786 1787
#[link(name = "crypto")]
extern { }
S
Steve Klabnik 已提交
1788
```
S
Steve Klabnik 已提交
1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809

The type of a function declared in an extern block is `extern "abi" fn(A1, ...,
An) -> R`, where `A1...An` are the declared types of its arguments and `R` is
the declared return type.

## Visibility and Privacy

These two terms are often used interchangeably, and what they are attempting to
convey is the answer to the question "Can this item be used at this location?"

Rust's name resolution operates on a global hierarchy of namespaces. Each level
in the hierarchy can be thought of as some item. The items are one of those
mentioned above, but also include external crates. Declaring or defining a new
module can be thought of as inserting a new tree into the hierarchy at the
location of the definition.

To control whether interfaces can be used across modules, Rust checks each use
of an item to see whether it should be allowed or not. This is where privacy
warnings are generated, or otherwise "you used a private item of another module
and weren't allowed to."

S
Steve Klabnik 已提交
1810
By default, everything in Rust is *private*, with one exception. Enum variants
S
Steve Klabnik 已提交
1811 1812 1813 1814
in a `pub` enum are also public by default. You are allowed to alter this
default visibility with the `priv` keyword. When an item is declared as `pub`,
it can be thought of as being accessible to the outside world. For example:

S
Steve Klabnik 已提交
1815
```
S
Steve Klabnik 已提交
1816 1817 1818 1819 1820 1821
# fn main() {}
// Declare a private struct
struct Foo;

// Declare a public struct with a private field
pub struct Bar {
1822
    field: i32
S
Steve Klabnik 已提交
1823 1824 1825 1826 1827 1828 1829
}

// Declare a public enum with two public variants
pub enum State {
    PubliclyAccessibleState,
    PubliclyAccessibleState2,
}
S
Steve Klabnik 已提交
1830
```
S
Steve Klabnik 已提交
1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841

With the notion of an item being either public or private, Rust allows item
accesses in two cases:

1. If an item is public, then it can be used externally through any of its
   public ancestors.
2. If an item is private, it may be accessed by the current module and its
   descendants.

These two cases are surprisingly powerful for creating module hierarchies
exposing public APIs while hiding internal implementation details. To help
1842
explain, here's a few use cases and what they would entail:
S
Steve Klabnik 已提交
1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872

* A library developer needs to expose functionality to crates which link
  against their library. As a consequence of the first case, this means that
  anything which is usable externally must be `pub` from the root down to the
  destination item. Any private item in the chain will disallow external
  accesses.

* A crate needs a global available "helper module" to itself, but it doesn't
  want to expose the helper module as a public API. To accomplish this, the
  root of the crate's hierarchy would have a private module which then
  internally has a "public api". Because the entire crate is a descendant of
  the root, then the entire local crate can access this private module through
  the second case.

* When writing unit tests for a module, it's often a common idiom to have an
  immediate child of the module to-be-tested named `mod test`. This module
  could access any items of the parent module through the second case, meaning
  that internal implementation details could also be seamlessly tested from the
  child module.

In the second case, it mentions that a private item "can be accessed" by the
current module and its descendants, but the exact meaning of accessing an item
depends on what the item is. Accessing a module, for example, would mean
looking inside of it (to import more items). On the other hand, accessing a
function would mean that it is invoked. Additionally, path expressions and
import statements are considered to access an item in the sense that the
import/expression is only valid if the destination is in the current visibility
scope.

Here's an example of a program which exemplifies the three cases outlined
1873
above:
S
Steve Klabnik 已提交
1874

S
Steve Klabnik 已提交
1875
```
S
Steve Klabnik 已提交
1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922
// This module is private, meaning that no external crate can access this
// module. Because it is private at the root of this current crate, however, any
// module in the crate may access any publicly visible item in this module.
mod crate_helper_module {

    // This function can be used by anything in the current crate
    pub fn crate_helper() {}

    // This function *cannot* be used by anything else in the crate. It is not
    // publicly visible outside of the `crate_helper_module`, so only this
    // current module and its descendants may access it.
    fn implementation_detail() {}
}

// This function is "public to the root" meaning that it's available to external
// crates linking against this one.
pub fn public_api() {}

// Similarly to 'public_api', this module is public so external crates may look
// inside of it.
pub mod submodule {
    use crate_helper_module;

    pub fn my_method() {
        // Any item in the local crate may invoke the helper module's public
        // interface through a combination of the two rules above.
        crate_helper_module::crate_helper();
    }

    // This function is hidden to any module which is not a descendant of
    // `submodule`
    fn my_implementation() {}

    #[cfg(test)]
    mod test {

        #[test]
        fn test_my_implementation() {
            // Because this module is a descendant of `submodule`, it's allowed
            // to access private items inside of `submodule` without a privacy
            // violation.
            super::my_implementation();
        }
    }
}

# fn main() {}
S
Steve Klabnik 已提交
1923
```
S
Steve Klabnik 已提交
1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935

For a rust program to pass the privacy checking pass, all paths must be valid
accesses given the two rules above. This includes all use statements,
expressions, types, etc.

### Re-exporting and Visibility

Rust allows publicly re-exporting items through a `pub use` directive. Because
this is a public directive, this allows the item to be used in the current
module through the rules above. It essentially allows public access into the
re-exported item. For example, this program is valid:

S
Steve Klabnik 已提交
1936
```
S
Steve Klabnik 已提交
1937 1938 1939 1940 1941 1942 1943
pub use self::implementation as api;

mod implementation {
    pub fn f() {}
}

# fn main() {}
S
Steve Klabnik 已提交
1944
```
S
Steve Klabnik 已提交
1945 1946 1947 1948 1949 1950 1951 1952 1953 1954

This means that any external crate referencing `implementation::f` would
receive a privacy violation, while the path `api::f` would be allowed.

When re-exporting a private item, it can be thought of as allowing the "privacy
chain" being short-circuited through the reexport instead of passing through
the namespace hierarchy as it normally would.

## Attributes

S
Steve Klabnik 已提交
1955
```{.ebnf .gram}
1956
attribute : "#!" ? '[' meta_item ']' ;
S
Steve Klabnik 已提交
1957 1958 1959
meta_item : ident [ '=' literal
                  | '(' meta_seq ')' ] ? ;
meta_seq : meta_item [ ',' meta_seq ] ? ;
S
Steve Klabnik 已提交
1960
```
S
Steve Klabnik 已提交
1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978

Any item declaration may have an _attribute_ applied to it. Attributes in Rust
are modeled on Attributes in ECMA-335, with the syntax coming from ECMA-334
(C#). An attribute is a general, free-form metadatum that is interpreted
according to name, convention, and language and compiler version. Attributes
may appear as any of:

* A single identifier, the attribute name
* An identifier followed by the equals sign '=' and a literal, providing a
  key/value pair
* An identifier followed by a parenthesized list of sub-attribute arguments

Attributes with a bang ("!") after the hash ("#") apply to the item that the
attribute is declared within. Attributes that do not have a bang after the hash
apply to the item that follows the attribute.

An example of attributes:

S
Steve Klabnik 已提交
1979
```{.rust}
S
Steve Klabnik 已提交
1980
// General metadata applied to the enclosing module or crate.
1981
#![crate_type = "lib"]
S
Steve Klabnik 已提交
1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997

// A function marked as a unit test
#[test]
fn test_foo() {
  /* ... */
}

// A conditionally-compiled module
#[cfg(target_os="linux")]
mod bar {
  /* ... */
}

// A lint attribute used to suppress a warning/error
#[allow(non_camel_case_types)]
type int8_t = i8;
S
Steve Klabnik 已提交
1998
```
S
Steve Klabnik 已提交
1999 2000 2001 2002 2003 2004 2005 2006

> **Note:** At some point in the future, the compiler will distinguish between
> language-reserved and user-available attributes. Until then, there is
> effectively no difference between an attribute handled by a loadable syntax
> extension and the compiler.

### Crate-only attributes

2007
- `crate_name` - specify the this crate's crate name.
S
Steve Klabnik 已提交
2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030
- `crate_type` - see [linkage](#linkage).
- `feature` - see [compiler features](#compiler-features).
- `no_builtins` - disable optimizing certain code patterns to invocations of
                  library functions that are assumed to exist
- `no_main` - disable emitting the `main` symbol. Useful when some other
   object being linked to defines `main`.
- `no_start` - disable linking to the `native` crate, which specifies the
  "start" language item.
- `no_std` - disable linking to the `std` crate.

### Module-only attributes

- `no_implicit_prelude` - disable injecting `use std::prelude::*` in this
  module.
- `path` - specifies the file to load the module from. `#[path="foo.rs"] mod
  bar;` is equivalent to `mod bar { /* contents of foo.rs */ }`. The path is
  taken relative to the directory that the current module is in.

### Function-only attributes

- `main` - indicates that this function should be passed to the entry point,
  rather than the function in the crate root named `main`.
- `plugin_registrar` - mark this function as the registration point for
2031
  [compiler plugins][plugin], such as loadable syntax extensions.
S
Steve Klabnik 已提交
2032
- `start` - indicates that this function should be used as the entry point,
S
Steve Klabnik 已提交
2033
  overriding the "start" language item. See the "start" [language
S
Steve Klabnik 已提交
2034
  item](#language-items) for more details.
S
Steve Klabnik 已提交
2035 2036
- `test` - indicates that this function is a test function, to only be compiled
  in case of `--test`.
2037 2038 2039
- `should_fail` - indicates that this test function should panic, inverting the success condition.
- `cold` - The function is unlikely to be executed, so optimize it (and calls
  to it) differently.
S
Steve Klabnik 已提交
2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054

### Static-only attributes

- `thread_local` - on a `static mut`, this signals that the value of this
  static may change depending on the current thread. The exact consequences of
  this are implementation-defined.

### FFI attributes

On an `extern` block, the following attributes are interpreted:

- `link_args` - specify arguments to the linker, rather than just the library
  name and type. This is feature gated and the exact behavior is
  implementation-defined (due to variety of linker invocation syntax).
- `link` - indicate that a native library should be linked to for the
2055 2056 2057 2058
  declarations in this block to be linked correctly. `link` supports an optional `kind`
  key with three possible values: `dylib`, `static`, and `framework`. See [external blocks](#external-blocks) for more about external blocks. Two
  examples: `#[link(name = "readline")]` and
  `#[link(name = "CoreFoundation", kind = "framework")]`.
S
Steve Klabnik 已提交
2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084

On declarations inside an `extern` block, the following attributes are
interpreted:

- `link_name` - the name of the symbol that this function or static should be
  imported as.
- `linkage` - on a static, this specifies the [linkage
  type](http://llvm.org/docs/LangRef.html#linkage-types).

On `enum`s:

- `repr` - on C-like enums, this sets the underlying type used for
  representation. Takes one argument, which is the primitive
  type this enum should be represented for, or `C`, which specifies that it
  should be the default `enum` size of the C ABI for that platform. Note that
  enum representation in C is undefined, and this may be incorrect when the C
  code is compiled with certain flags.

On `struct`s:

- `repr` - specifies the representation to use for this struct. Takes a list
  of options. The currently accepted ones are `C` and `packed`, which may be
  combined. `C` will use a C ABI compatible struct layout, and `packed` will
  remove any padding between fields (note that this is very fragile and may
  break platforms which require aligned access).

K
Keegan McAllister 已提交
2085 2086 2087 2088 2089 2090 2091 2092 2093
### Macro- and plugin-related attributes

- `macro_use` on a `mod` — macros defined in this module will be visible in the
  module's parent, after this module has been included.

- `macro_use` on an `extern crate` — load macros from this crate.  An optional
  list of names `#[macro_use(foo, bar)]` restricts the import to just those
  macros named.  The `extern crate` must appear at the crate root, not inside
  `mod`, which ensures proper function of the [`$crate` macro
S
Steve Klabnik 已提交
2094
  variable](book/macros.html#the-variable-$crate).
K
Keegan McAllister 已提交
2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107

- `macro_reexport` on an `extern crate` — re-export the named macros.

- `macro_export` - export a macro for cross-crate usage.

- `plugin` on an `extern crate` — load this crate as a [compiler
  plugin][plugin].  The `plugin` feature gate is required.  Any arguments to
  the attribute, e.g. `#[plugin=...]` or `#[plugin(...)]`, are provided to the
  plugin.

- `no_link` on an `extern crate` — even if we load this crate for macros or
  compiler plugins, don't link it into the output.

S
Steve Klabnik 已提交
2108 2109 2110
See the [macros section of the
book](book/macros.html#scoping-and-macro-import/export) for more information on
macro scope.
K
Keegan McAllister 已提交
2111 2112


S
Steve Klabnik 已提交
2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133
### Miscellaneous attributes

- `export_name` - on statics and functions, this determines the name of the
  exported symbol.
- `link_section` - on statics and functions, this specifies the section of the
  object file that this item's contents will be placed into.
- `no_mangle` - on any item, do not apply the standard name mangling. Set the
  symbol for this item to its identifier.
- `packed` - on structs or enums, eliminate any padding that would be used to
  align fields.
- `simd` - on certain tuple structs, derive the arithmetic operators, which
  lower to the target's SIMD instructions, if any; the `simd` feature gate
  is necessary to use this attribute.
- `static_assert` - on statics whose type is `bool`, terminates compilation
  with an error if it is not initialized to `true`.
- `unsafe_destructor` - allow implementations of the "drop" language item
  where the type it is implemented for does not implement the "send" language
  item; the `unsafe_destructor` feature gate is needed to use this attribute
- `unsafe_no_drop_flag` - on structs, remove the flag that prevents
  destructors from being run twice. Destructors might be run multiple times on
  the same object with this attribute.
2134
- `doc` - Doc comments such as `/// foo` are equivalent to `#[doc = "foo"]`.
M
docs  
Manish Goregaokar 已提交
2135 2136 2137 2138 2139 2140 2141
- `rustc_on_unimplemented` - Write a custom note to be shown along with the error
   when the trait is found to be unimplemented on a type.
   You may use format arguments like `{T}`, `{A}` to correspond to the
   types at the point of use corresponding to the type parameters of the
   trait of the same name. `{Self}` will be replaced with the type that is supposed
   to implement the trait but doesn't. To use this, the `on_unimplemented` feature gate
   must be enabled.
S
Steve Klabnik 已提交
2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153

### Conditional compilation

Sometimes one wants to have different compiler outputs from the same code,
depending on build target, such as targeted operating system, or to enable
release builds.

There are two kinds of configuration options, one that is either defined or not
(`#[cfg(foo)]`), and the other that contains a string that can be checked
against (`#[cfg(bar = "baz")]` (currently only compiler-defined configuration
options can have the latter form).

S
Steve Klabnik 已提交
2154
```
S
Steve Klabnik 已提交
2155 2156 2157 2158 2159 2160 2161
// The function is only included in the build when compiling for OSX
#[cfg(target_os = "macos")]
fn macos_only() {
  // ...
}

// This function is only included when either foo or bar is defined
S
Steven Fackler 已提交
2162
#[cfg(any(foo, bar))]
S
Steve Klabnik 已提交
2163 2164 2165 2166 2167 2168
fn needs_foo_or_bar() {
  // ...
}

// This function is only included when compiling for a unixish OS with a 32-bit
// architecture
S
Steven Fackler 已提交
2169
#[cfg(all(unix, target_word_size = "32"))]
S
Steve Klabnik 已提交
2170 2171 2172
fn on_32bit_unix() {
  // ...
}
S
Steven Fackler 已提交
2173 2174 2175 2176 2177 2178

// This function is only included when foo is not defined
#[cfg(not(foo))]
fn needs_not_foo() {
  // ...
}
S
Steve Klabnik 已提交
2179
```
S
Steve Klabnik 已提交
2180 2181

This illustrates some conditional compilation can be achieved using the
S
Steven Fackler 已提交
2182 2183
`#[cfg(...)]` attribute. `any`, `all` and `not` can be used to assemble
arbitrarily complex configurations through nesting.
S
Steve Klabnik 已提交
2184 2185 2186 2187

The following configurations must be defined by the implementation:

* `target_arch = "..."`. Target CPU architecture, such as `"x86"`, `"x86_64"`
2188
  `"mips"`, `"powerpc"`, `"arm"`, or `"aarch64"`.
S
Steve Klabnik 已提交
2189 2190 2191 2192 2193 2194
* `target_endian = "..."`. Endianness of the target CPU, either `"little"` or
  `"big"`.
* `target_family = "..."`. Operating system family of the target, e. g.
  `"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
S
Sébastien Marie 已提交
2195 2196
  `"win32"`, `"macos"`, `"linux"`, `"android"`, `"freebsd"`, `"dragonfly"` or
  `"openbsd"`.
S
Steve Klabnik 已提交
2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218
* `target_word_size = "..."`. Target word size in bits. This is set to `"32"`
  for targets with 32-bit pointers, and likewise set to `"64"` for 64-bit
  pointers.
* `unix`. See `target_family`.
* `windows`. See `target_family`.

### Lint check attributes

A lint check names a potentially undesirable coding pattern, such as
unreachable code or omitted documentation, for the static entity to which the
attribute applies.

For any lint check `C`:

* `allow(C)` overrides the check for `C` so that violations will go
   unreported,
* `deny(C)` signals an error after encountering a violation of `C`,
* `forbid(C)` is the same as `deny(C)`, but also forbids changing the lint
   level afterwards,
* `warn(C)` warns about violations of `C` but continues compilation.

The lint checks supported by the compiler can be found via `rustc -W help`,
2219
along with their default settings.  [Compiler
Y
York Xiang 已提交
2220
plugins](book/plugins.html#lint-plugins) can provide additional lint checks.
S
Steve Klabnik 已提交
2221

S
Steve Klabnik 已提交
2222
```{.ignore}
S
Steve Klabnik 已提交
2223 2224
mod m1 {
    // Missing documentation is ignored here
2225
    #[allow(missing_docs)]
2226
    pub fn undocumented_one() -> i32 { 1 }
S
Steve Klabnik 已提交
2227 2228

    // Missing documentation signals a warning here
2229
    #[warn(missing_docs)]
2230
    pub fn undocumented_too() -> i32 { 2 }
S
Steve Klabnik 已提交
2231 2232

    // Missing documentation signals an error here
2233
    #[deny(missing_docs)]
2234
    pub fn undocumented_end() -> i32 { 3 }
S
Steve Klabnik 已提交
2235
}
S
Steve Klabnik 已提交
2236
```
S
Steve Klabnik 已提交
2237 2238

This example shows how one can use `allow` and `warn` to toggle a particular
2239
check on and off:
S
Steve Klabnik 已提交
2240

S
Steve Klabnik 已提交
2241
```{.ignore}
2242
#[warn(missing_docs)]
S
Steve Klabnik 已提交
2243
mod m2{
2244
    #[allow(missing_docs)]
S
Steve Klabnik 已提交
2245 2246
    mod nested {
        // Missing documentation is ignored here
2247
        pub fn undocumented_one() -> i32 { 1 }
S
Steve Klabnik 已提交
2248 2249 2250

        // Missing documentation signals a warning here,
        // despite the allow above.
2251
        #[warn(missing_docs)]
2252
        pub fn undocumented_two() -> i32 { 2 }
S
Steve Klabnik 已提交
2253 2254 2255
    }

    // Missing documentation signals a warning here
2256
    pub fn undocumented_too() -> i32 { 3 }
S
Steve Klabnik 已提交
2257
}
S
Steve Klabnik 已提交
2258
```
S
Steve Klabnik 已提交
2259 2260

This example shows how one can use `forbid` to disallow uses of `allow` for
2261
that lint check:
S
Steve Klabnik 已提交
2262

S
Steve Klabnik 已提交
2263
```{.ignore}
2264
#[forbid(missing_docs)]
S
Steve Klabnik 已提交
2265 2266
mod m3 {
    // Attempting to toggle warning signals an error here
2267
    #[allow(missing_docs)]
S
Steve Klabnik 已提交
2268
    /// Returns 2.
2269
    pub fn undocumented_too() -> i32 { 2 }
S
Steve Klabnik 已提交
2270
}
S
Steve Klabnik 已提交
2271
```
S
Steve Klabnik 已提交
2272 2273 2274 2275

### Language items

Some primitive Rust operations are defined in Rust code, rather than being
S
Steve Klabnik 已提交
2276 2277 2278
implemented directly in C or assembly language. The definitions of these
operations have to be easy for the compiler to find. The `lang` attribute
makes it possible to declare these operations. For example, the `str` module
S
Steve Klabnik 已提交
2279 2280
in the Rust standard library defines the string equality function:

S
Steve Klabnik 已提交
2281
```{.ignore}
S
Steve Klabnik 已提交
2282 2283 2284 2285
#[lang="str_eq"]
pub fn eq_slice(a: &str, b: &str) -> bool {
    // details elided
}
S
Steve Klabnik 已提交
2286
```
S
Steve Klabnik 已提交
2287 2288 2289 2290 2291

The name `str_eq` has a special meaning to the Rust compiler, and the presence
of this definition means that it will use this definition when generating calls
to the string equality function.

2292
A complete list of the built-in language items will be added in the future.
S
Steve Klabnik 已提交
2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304

### Inline attributes

The inline attribute is used to suggest to the compiler to perform an inline
expansion and place a copy of the function or static in the caller rather than
generating code to call the function or access the static where it is defined.

The compiler automatically inlines functions based on internal heuristics.
Incorrectly inlining functions can actually making the program slower, so it
should be used with care.

Immutable statics are always considered inlineable unless marked with
S
Steve Klabnik 已提交
2305 2306
`#[inline(never)]`. It is undefined whether two different inlineable statics
have the same memory address. In other words, the compiler is free to collapse
S
Steve Klabnik 已提交
2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317
duplicate inlineable statics together.

`#[inline]` and `#[inline(always)]` always causes the function to be serialized
into crate metadata to allow cross-crate inlining.

There are three different types of inline attributes:

* `#[inline]` hints the compiler to perform an inline expansion.
* `#[inline(always)]` asks the compiler to always perform an inline expansion.
* `#[inline(never)]` asks the compiler to never perform an inline expansion.

2318
### `derive`
S
Steve Klabnik 已提交
2319

2320
The `derive` attribute allows certain traits to be automatically implemented
S
Steve Klabnik 已提交
2321 2322 2323 2324
for data structures. For example, the following will create an `impl` for the
`PartialEq` and `Clone` traits for `Foo`, the type parameter `T` will be given
the `PartialEq` or `Clone` constraints for the appropriate `impl`:

S
Steve Klabnik 已提交
2325
```
2326
#[derive(PartialEq, Clone)]
S
Steve Klabnik 已提交
2327
struct Foo<T> {
2328
    a: i32,
S
Steve Klabnik 已提交
2329 2330
    b: T
}
S
Steve Klabnik 已提交
2331
```
S
Steve Klabnik 已提交
2332 2333 2334

The generated `impl` for `PartialEq` is equivalent to

S
Steve Klabnik 已提交
2335
```
2336
# struct Foo<T> { a: i32, b: T }
S
Steve Klabnik 已提交
2337 2338 2339 2340 2341 2342 2343 2344 2345
impl<T: PartialEq> PartialEq for Foo<T> {
    fn eq(&self, other: &Foo<T>) -> bool {
        self.a == other.a && self.b == other.b
    }

    fn ne(&self, other: &Foo<T>) -> bool {
        self.a != other.a || self.b != other.b
    }
}
S
Steve Klabnik 已提交
2346
```
S
Steve Klabnik 已提交
2347

2348
Supported traits for `derive` are:
S
Steve Klabnik 已提交
2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368

* Comparison traits: `PartialEq`, `Eq`, `PartialOrd`, `Ord`.
* Serialization: `Encodable`, `Decodable`. These require `serialize`.
* `Clone`, to create `T` from `&T` via a copy.
* `Default`, to create an empty instance of a data type.
* `FromPrimitive`, to create an instance from a numeric primitive.
* `Hash`, to iterate over the bytes in a data type.
* `Rand`, to create a random instance of a data type.
* `Show`, to format a value using the `{}` formatter.
* `Zero`, to create a zero instance of a numeric data type.

### Compiler Features

Certain aspects of Rust may be implemented in the compiler, but they're not
necessarily ready for every-day use. These features are often of "prototype
quality" or "almost production ready", but may not be stable enough to be
considered a full-fledged language feature.

For this reason, Rust recognizes a special crate-level attribute of the form:

S
Steve Klabnik 已提交
2369
```{.ignore}
S
Steve Klabnik 已提交
2370
#![feature(feature1, feature2, feature3)]
S
Steve Klabnik 已提交
2371
```
S
Steve Klabnik 已提交
2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404

This directive informs the compiler that the feature list: `feature1`,
`feature2`, and `feature3` should all be enabled. This is only recognized at a
crate-level, not at a module-level. Without this directive, all features are
considered off, and using the features will result in a compiler error.

The currently implemented features of the reference compiler are:

* `asm` - The `asm!` macro provides a means for inline assembly. This is often
          useful, but the exact syntax for this feature along with its
          semantics are likely to change, so this macro usage must be opted
          into.

* `concat_idents` - Allows use of the `concat_idents` macro, which is in many
                    ways insufficient for concatenating identifiers, and may be
                    removed entirely for something more wholesome.

* `default_type_params` - Allows use of default type parameters. The future of
                          this feature is uncertain.

* `intrinsics` - Allows use of the "rust-intrinsics" ABI. Compiler intrinsics
                 are inherently unstable and no promise about them is made.

* `lang_items` - Allows use of the `#[lang]` attribute. Like `intrinsics`,
                 lang items are inherently unstable and no promise about them
                 is made.

* `link_args` - This attribute is used to specify custom flags to the linker,
                but usage is strongly discouraged. The compiler's usage of the
                system linker is not guaranteed to continue in the future, and
                if the system linker is not used then specifying custom flags
                doesn't have much meaning.

2405 2406 2407
* `link_llvm_intrinsics` – Allows linking to LLVM intrinsics via
                           `#[link_name="llvm.*"]`.

S
Steve Klabnik 已提交
2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418
* `linkage` - Allows use of the `linkage` attribute, which is not portable.

* `log_syntax` - Allows use of the `log_syntax` macro attribute, which is a
                 nasty hack that will certainly be removed.

* `non_ascii_idents` - The compiler supports the use of non-ascii identifiers,
                       but the implementation is a little rough around the
                       edges, so this can be seen as an experimental feature
                       for now until the specification of identifiers is fully
                       fleshed out.

K
Keegan McAllister 已提交
2419 2420
* `plugin` - Usage of [compiler plugins][plugin] for custom lints or syntax extensions.
             These depend on compiler internals and are subject to change.
S
Steve Klabnik 已提交
2421

K
Keegan McAllister 已提交
2422
* `plugin_registrar` - Indicates that a crate provides [compiler plugins][plugin].
S
Steve Klabnik 已提交
2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433

* `quote` - Allows use of the `quote_*!` family of macros, which are
            implemented very poorly and will likely change significantly
            with a proper implementation.

* `rustc_diagnostic_macros`- A mysterious feature, used in the implementation
                             of rustc, not meant for mortals.

* `simd` - Allows use of the `#[simd]` attribute, which is overly simple and
           not the SIMD interface we want to expose in the long term.

2434 2435
* `staged_api` - Allows usage of stability markers and `#![staged_api]` in a crate

S
Steve Klabnik 已提交
2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450
* `struct_inherit` - Allows using struct inheritance, which is barely
                     implemented and will probably be removed. Don't use this.

* `struct_variant` - Structural enum variants (those with named fields). It is
                     currently unknown whether this style of enum variant is as
                     fully supported as the tuple-forms, and it's not certain
                     that this style of variant should remain in the language.
                     For now this style of variant is hidden behind a feature
                     flag.

* `thread_local` - The usage of the `#[thread_local]` attribute is experimental
                   and should be seen as unstable. This attribute is used to
                   declare a `static` as being unique per-thread leveraging
                   LLVM's implementation which works in concert with the kernel
                   loader and dynamic linker. This is not necessarily available
S
Steve Klabnik 已提交
2451
                   on all platforms, and usage of it is discouraged.
S
Steve Klabnik 已提交
2452 2453 2454 2455

* `trace_macros` - Allows use of the `trace_macros` macro, which is a nasty
                   hack that will certainly be removed.

2456 2457
* `unboxed_closures` - Rust's new closure design, which is currently a work in
                       progress feature with many known bugs.
S
Steve Klabnik 已提交
2458 2459 2460 2461 2462

* `unsafe_destructor` - Allows use of the `#[unsafe_destructor]` attribute,
                        which is considered wildly unsafe and will be
                        obsoleted by language improvements.

2463 2464 2465 2466 2467
* `unmarked_api` - Allows use of items within a `#![staged_api]` crate
                   which have not been marked with a stability marker.
                   Such items should not be allowed by the compiler to exist,
                   so if you need this there probably is a compiler bug.

S
Steve Klabnik 已提交
2468 2469 2470 2471 2472 2473 2474 2475 2476 2477
* `associated_types` - Allows type aliases in traits. Experimental.

If a feature is promoted to a language feature, then all existing programs will
start to receive compilation warnings about #[feature] directives which enabled
the new feature (because the directive is no longer necessary). However, if a
feature is decided to be removed from the language, errors will be issued (if
there isn't a parser error first). The directive in this case is no longer
necessary, and it's likely that existing code will break if the feature isn't
removed.

A
Alex Gaynor 已提交
2478
If an unknown feature is found in a directive, it results in a compiler error.
S
Steve Klabnik 已提交
2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504
An unknown feature is one which has never been recognized by the compiler.

# Statements and expressions

Rust is _primarily_ an expression language. This means that most forms of
value-producing or effect-causing evaluation are directed by the uniform syntax
category of _expressions_. Each kind of expression can typically _nest_ within
each other kind of expression, and rules for evaluation of expressions involve
specifying both the value produced by the expression and the order in which its
sub-expressions are themselves evaluated.

In contrast, statements in Rust serve _mostly_ to contain and explicitly
sequence expression evaluation.

## Statements

A _statement_ is a component of a block, which is in turn a component of an
outer [expression](#expressions) or [function](#functions).

Rust has two kinds of statement: [declaration
statements](#declaration-statements) and [expression
statements](#expression-statements).

### Declaration statements

A _declaration statement_ is one that introduces one or more *names* into the
S
Steve Klabnik 已提交
2505
enclosing statement block. The declared names may denote new slots or new
S
Steve Klabnik 已提交
2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521
items.

#### Item declarations

An _item declaration statement_ has a syntactic form identical to an
[item](#items) declaration within a module. Declaring an item &mdash; a
function, enumeration, structure, type, static, trait, implementation or module
&mdash; locally within a statement block is simply a way of restricting its
scope to a narrow region containing all of its uses; it is otherwise identical
in meaning to declaring the item outside the statement block.

> **Note**: there is no implicit capture of the function's dynamic environment when
> declaring a function-local item.

#### Slot declarations

S
Steve Klabnik 已提交
2522
```{.ebnf .gram}
S
Steve Klabnik 已提交
2523 2524
let_decl : "let" pat [':' type ] ? [ init ] ? ';' ;
init : [ '=' ] expr ;
S
Steve Klabnik 已提交
2525
```
S
Steve Klabnik 已提交
2526

S
Steve Klabnik 已提交
2527
A _slot declaration_ introduces a new set of slots, given by a pattern. The
S
Steve Klabnik 已提交
2528 2529 2530 2531 2532 2533 2534 2535 2536
pattern may be followed by a type annotation, and/or an initializer expression.
When no type annotation is given, the compiler will infer the type, or signal
an error if insufficient type information is available for definite inference.
Any slots introduced by a slot declaration are visible from the point of
declaration until the end of the enclosing block scope.

### Expression statements

An _expression statement_ is one that evaluates an [expression](#expressions)
S
Steve Klabnik 已提交
2537 2538
and ignores its result. The type of an expression statement `e;` is always
`()`, regardless of the type of `e`. As a rule, an expression statement's
S
Steve Klabnik 已提交
2539 2540 2541 2542 2543
purpose is to trigger the effects of evaluating its expression.

## Expressions

An expression may have two roles: it always produces a *value*, and it may have
S
Steve Klabnik 已提交
2544 2545 2546
*effects* (otherwise known as "side effects"). An expression *evaluates to* a
value, and has effects during *evaluation*. Many expressions contain
sub-expressions (operands). The meaning of each kind of expression dictates
S
Steve Klabnik 已提交
2547
several things:
2548 2549 2550 2551

* Whether or not to evaluate the sub-expressions when evaluating the expression
* The order in which to evaluate the sub-expressions
* How to combine the sub-expressions' values to obtain the value of the expression
S
Steve Klabnik 已提交
2552 2553 2554 2555 2556 2557 2558 2559 2560

In this way, the structure of expressions dictates the structure of execution.
Blocks are just another kind of expression, so blocks, statements, expressions,
and blocks again can recursively nest inside each other to an arbitrary depth.

#### Lvalues, rvalues and temporaries

Expressions are divided into two main categories: _lvalues_ and _rvalues_.
Likewise within each expression, sub-expressions may occur in _lvalue context_
S
Steve Klabnik 已提交
2561
or _rvalue context_. The evaluation of an expression depends both on its own
S
Steve Klabnik 已提交
2562 2563 2564 2565 2566 2567
category and the context it occurs within.

An lvalue is an expression that represents a memory location. These expressions
are [paths](#path-expressions) (which refer to local variables, function and
method arguments, or static variables), dereferences (`*expr`), [indexing
expressions](#index-expressions) (`expr[expr]`), and [field
S
Steve Klabnik 已提交
2568
references](#field-expressions) (`expr.f`). All other expressions are rvalues.
S
Steve Klabnik 已提交
2569 2570 2571 2572

The left operand of an [assignment](#assignment-expressions) or
[compound-assignment](#compound-assignment-expressions) expression is an lvalue
context, as is the single operand of a unary
S
Steve Klabnik 已提交
2573
[borrow](#unary-operator-expressions). All other expression contexts are
S
Steve Klabnik 已提交
2574 2575 2576 2577 2578 2579
rvalue contexts.

When an lvalue is evaluated in an _lvalue context_, it denotes a memory
location; when evaluated in an _rvalue context_, it denotes the value held _in_
that memory location.

A
Alex Gaynor 已提交
2580
When an rvalue is used in an lvalue context, a temporary un-named lvalue is
S
Steve Klabnik 已提交
2581
created and used instead. A temporary's lifetime equals the largest lifetime
S
Steve Klabnik 已提交
2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597
of any reference that points to it.

#### Moved and copied types

When a [local variable](#memory-slots) is used as an
[rvalue](#lvalues,-rvalues-and-temporaries) the variable will either be moved
or copied, depending on its type. For types that contain [owning
pointers](#pointer-types) or values that implement the special trait `Drop`,
the variable is moved. All other types are copied.

### Literal expressions

A _literal expression_ consists of one of the [literal](#literals) forms
described earlier. It directly describes a number, character, string, boolean
value, or the unit value.

S
Steve Klabnik 已提交
2598
```{.literals}
S
Steve Klabnik 已提交
2599 2600 2601 2602
();        // unit type
"hello";   // string type
'5';       // character type
5;         // integer type
S
Steve Klabnik 已提交
2603
```
S
Steve Klabnik 已提交
2604 2605 2606 2607

### Path expressions

A [path](#paths) used as an expression context denotes either a local variable
S
Steve Klabnik 已提交
2608
or an item. Path expressions are [lvalues](#lvalues,-rvalues-and-temporaries).
S
Steve Klabnik 已提交
2609 2610 2611

### Tuple expressions

J
Jakub Bukaj 已提交
2612
Tuples are written by enclosing zero or more comma-separated expressions in
S
Steve Klabnik 已提交
2613 2614
parentheses. They are used to create [tuple-typed](#tuple-types) values.

S
Steve Klabnik 已提交
2615
```{.tuple}
S
Steve Klabnik 已提交
2616 2617
(0,);
(0.0, 4.5);
2618
("a", 4us, true);
S
Steve Klabnik 已提交
2619
```
S
Steve Klabnik 已提交
2620

J
Jakub Bukaj 已提交
2621 2622 2623 2624 2625
### Unit expressions

The expression `()` denotes the _unit value_, the only value of the type with
the same name.

S
Steve Klabnik 已提交
2626 2627
### Structure expressions

S
Steve Klabnik 已提交
2628
```{.ebnf .gram}
S
Steve Klabnik 已提交
2629 2630 2631 2632 2633 2634
struct_expr : expr_path '{' ident ':' expr
                      [ ',' ident ':' expr ] *
                      [ ".." expr ] '}' |
              expr_path '(' expr
                      [ ',' expr ] * ')' |
              expr_path ;
S
Steve Klabnik 已提交
2635
```
S
Steve Klabnik 已提交
2636

S
Steve Klabnik 已提交
2637
There are several forms of structure expressions. A _structure expression_
S
Steve Klabnik 已提交
2638 2639
consists of the [path](#paths) of a [structure item](#structures), followed by
a brace-enclosed list of one or more comma-separated name-value pairs,
S
Steve Klabnik 已提交
2640
providing the field values of a new instance of the structure. A field name
S
Steve Klabnik 已提交
2641 2642 2643 2644 2645 2646 2647
can be any identifier, and is separated from its value expression by a colon.
The location denoted by a structure field is mutable if and only if the
enclosing structure is mutable.

A _tuple structure expression_ consists of the [path](#paths) of a [structure
item](#structures), followed by a parenthesized list of one or more
comma-separated expressions (in other words, the path of a structure item
S
Steve Klabnik 已提交
2648
followed by a tuple expression). The structure item must be a tuple structure
S
Steve Klabnik 已提交
2649 2650 2651 2652 2653 2654 2655
item.

A _unit-like structure expression_ consists only of the [path](#paths) of a
[structure item](#structures).

The following are examples of structure expressions:

S
Steve Klabnik 已提交
2656
```
S
Steve Klabnik 已提交
2657 2658
# struct Point { x: f64, y: f64 }
# struct TuplePoint(f64, f64);
2659
# mod game { pub struct User<'a> { pub name: &'a str, pub age: u32, pub score: uint } }
S
Steve Klabnik 已提交
2660 2661 2662 2663 2664
# struct Cookie; fn some_fn<T>(t: T) {}
Point {x: 10.0, y: 20.0};
TuplePoint(10.0, 20.0);
let u = game::User {name: "Joe", age: 35, score: 100_000};
some_fn::<Cookie>(Cookie);
S
Steve Klabnik 已提交
2665
```
S
Steve Klabnik 已提交
2666

S
Steve Klabnik 已提交
2667
A structure expression forms a new value of the named structure type. Note
S
Steve Klabnik 已提交
2668 2669 2670 2671
that for a given *unit-like* structure type, this will always be the same
value.

A structure expression can terminate with the syntax `..` followed by an
S
Steve Klabnik 已提交
2672
expression to denote a functional update. The expression following `..` (the
S
Steve Klabnik 已提交
2673 2674 2675 2676 2677 2678
base) must have the same structure type as the new structure type being formed.
The entire expression denotes the result of constructing a new structure (with
the same type as the base expression) with the given values for the fields that
were explicitly specified and the values in the base expression for all other
fields.

S
Steve Klabnik 已提交
2679
```
2680
# struct Point3d { x: i32, y: i32, z: i32 }
S
Steve Klabnik 已提交
2681 2682
let base = Point3d {x: 1, y: 2, z: 3};
Point3d {y: 0, z: 10, .. base};
S
Steve Klabnik 已提交
2683
```
S
Steve Klabnik 已提交
2684 2685 2686

### Block expressions

S
Steve Klabnik 已提交
2687
```{.ebnf .gram}
2688
block_expr : '{' [ stmt ';' | item ] *
S
Steve Klabnik 已提交
2689
                 [ expr ] '}' ;
S
Steve Klabnik 已提交
2690
```
S
Steve Klabnik 已提交
2691 2692

A _block expression_ is similar to a module in terms of the declarations that
2693
are possible. Each block conceptually introduces a new namespace scope. Use
S
Steve Klabnik 已提交
2694 2695 2696 2697 2698 2699 2700 2701 2702 2703
items can bring new names into scopes and declared items are in scope for only
the block itself.

A block will execute each statement sequentially, and then execute the
expression (if given). If the final expression is omitted, the type and return
value of the block are `()`, but if it is provided, the type and return value
of the block are that of the expression itself.

### Method-call expressions

S
Steve Klabnik 已提交
2704
```{.ebnf .gram}
S
Steve Klabnik 已提交
2705
method_call_expr : expr '.' ident paren_expr_list ;
S
Steve Klabnik 已提交
2706
```
S
Steve Klabnik 已提交
2707 2708

A _method call_ consists of an expression followed by a single dot, an
S
Steve Klabnik 已提交
2709
identifier, and a parenthesized expression-list. Method calls are resolved to
S
Steve Klabnik 已提交
2710 2711 2712 2713 2714 2715
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).

### Field expressions

S
Steve Klabnik 已提交
2716
```{.ebnf .gram}
S
Steve Klabnik 已提交
2717
field_expr : expr '.' ident ;
S
Steve Klabnik 已提交
2718
```
S
Steve Klabnik 已提交
2719 2720 2721

A _field expression_ consists of an expression followed by a single dot and an
identifier, when not immediately followed by a parenthesized expression-list
S
Steve Klabnik 已提交
2722
(the latter is a [method call expression](#method-call-expressions)). A field
S
Steve Klabnik 已提交
2723 2724
expression denotes a field of a [structure](#structure-types).

S
Steve Klabnik 已提交
2725
```{.ignore .field}
S
Steve Klabnik 已提交
2726 2727 2728
mystruct.myfield;
foo().x;
(Struct {a: 10, b: 20}).a;
S
Steve Klabnik 已提交
2729
```
S
Steve Klabnik 已提交
2730 2731

A field access is an [lvalue](#lvalues,-rvalues-and-temporaries) referring to
A
Alex Gaynor 已提交
2732
the value of that field. When the type providing the field inherits mutability,
S
Steve Klabnik 已提交
2733 2734 2735 2736 2737 2738 2739
it can be [assigned](#assignment-expressions) to.

Also, if the type of the expression to the left of the dot is a pointer, it is
automatically dereferenced to make the field access possible.

### Array expressions

S
Steve Klabnik 已提交
2740
```{.ebnf .gram}
S
Steve Klabnik 已提交
2741 2742
array_expr : '[' "mut" ? vec_elems? ']' ;

A
Armin Preiml 已提交
2743
array_elems : [expr [',' expr]*] | [expr ';' expr] ;
S
Steve Klabnik 已提交
2744
```
S
Steve Klabnik 已提交
2745

S
Steve Klabnik 已提交
2746 2747
An [array](#array,-and-slice-types) _expression_ is written by enclosing zero
or more comma-separated expressions of uniform type in square brackets.
S
Steve Klabnik 已提交
2748

A
Armin Preiml 已提交
2749
In the `[expr ';' expr]` form, the expression after the `';'` must be a
S
Steve Klabnik 已提交
2750 2751 2752
constant expression that can be evaluated at compile time, such as a
[literal](#literals) or a [static item](#static-items).

S
Steve Klabnik 已提交
2753
```
2754
[1, 2, 3, 4];
S
Steve Klabnik 已提交
2755
["a", "b", "c", "d"];
2756
[0; 128];              // array with 128 zeros
S
Steve Klabnik 已提交
2757
[0u8, 0u8, 0u8, 0u8];
S
Steve Klabnik 已提交
2758
```
S
Steve Klabnik 已提交
2759 2760 2761

### Index expressions

S
Steve Klabnik 已提交
2762
```{.ebnf .gram}
S
Steve Klabnik 已提交
2763
idx_expr : expr '[' expr ']' ;
S
Steve Klabnik 已提交
2764
```
S
Steve Klabnik 已提交
2765

S
Steve Klabnik 已提交
2766
[Array](#array,-and-slice-types)-typed expressions can be indexed by
S
Steve Klabnik 已提交
2767 2768 2769 2770 2771
writing a square-bracket-enclosed expression (the index) after them. When the
array is mutable, the resulting [lvalue](#lvalues,-rvalues-and-temporaries) can
be assigned to.

Indices are zero-based, and may be of any integral type. Vector access is
S
Steve Klabnik 已提交
2772
bounds-checked at run-time. When the check fails, it will put the thread in a
S
Steve Klabnik 已提交
2773
_panicked state_.
S
Steve Klabnik 已提交
2774

S
Steve Klabnik 已提交
2775
```{should-fail}
S
Steve Klabnik 已提交
2776
([1, 2, 3, 4])[0];
S
Steve Klabnik 已提交
2777
(["a", "b"])[10]; // panics
S
Steve Klabnik 已提交
2778
```
S
Steve Klabnik 已提交
2779 2780 2781

### Unary operator expressions

2782 2783
Rust defines three unary operators. They are all written as prefix operators,
before the expression they apply to.
S
Steve Klabnik 已提交
2784 2785 2786 2787 2788

* `-`
  : Negation. May only be applied to numeric types.
* `*`
  : Dereference. When applied to a [pointer](#pointer-types) it denotes the
S
Steve Klabnik 已提交
2789
    pointed-to location. For pointers to mutable locations, the resulting
S
Steve Klabnik 已提交
2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803
    [lvalue](#lvalues,-rvalues-and-temporaries) can be assigned to.
    On non-pointer types, it calls the `deref` method of the `std::ops::Deref`
    trait, or the `deref_mut` method of the `std::ops::DerefMut` trait (if
    implemented by the type and required for an outer expression that will or
    could mutate the dereference), and produces the result of dereferencing the
    `&` or `&mut` borrowed pointer returned from the overload method.

* `!`
  : Logical negation. On the boolean type, this flips between `true` and
    `false`. On integer types, this inverts the individual bits in the
    two's complement representation of the value.

### Binary operator expressions

S
Steve Klabnik 已提交
2804
```{.ebnf .gram}
S
Steve Klabnik 已提交
2805
binop_expr : expr binop expr ;
S
Steve Klabnik 已提交
2806
```
S
Steve Klabnik 已提交
2807 2808 2809 2810 2811 2812 2813

Binary operators expressions are given in terms of [operator
precedence](#operator-precedence).

#### Arithmetic operators

Binary arithmetic expressions are syntactic sugar for calls to built-in traits,
S
Steve Klabnik 已提交
2814 2815
defined in the `std::ops` module of the `std` library. This means that
arithmetic operators can be overridden for user-defined types. The default
S
Steve Klabnik 已提交
2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836
meaning of the operators on standard types is given here.

* `+`
  : Addition and array/string concatenation.
    Calls the `add` method on the `std::ops::Add` trait.
* `-`
  : Subtraction.
    Calls the `sub` method on the `std::ops::Sub` trait.
* `*`
  : Multiplication.
    Calls the `mul` method on the `std::ops::Mul` trait.
* `/`
  : Quotient.
    Calls the `div` method on the `std::ops::Div` trait.
* `%`
  : Remainder.
    Calls the `rem` method on the `std::ops::Rem` trait.

#### Bitwise operators

Like the [arithmetic operators](#arithmetic-operators), bitwise operators are
S
Steve Klabnik 已提交
2837 2838
syntactic sugar for calls to methods of built-in traits. This means that
bitwise operators can be overridden for user-defined types. The default
S
Steve Klabnik 已提交
2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858
meaning of the operators on standard types is given here.

* `&`
  : And.
    Calls the `bitand` method of the `std::ops::BitAnd` trait.
* `|`
  : Inclusive or.
    Calls the `bitor` method of the `std::ops::BitOr` trait.
* `^`
  : Exclusive or.
    Calls the `bitxor` method of the `std::ops::BitXor` trait.
* `<<`
  : Logical left shift.
    Calls the `shl` method of the `std::ops::Shl` trait.
* `>>`
  : Logical right shift.
    Calls the `shr` method of the `std::ops::Shr` trait.

#### Lazy boolean operators

S
Steve Klabnik 已提交
2859
The operators `||` and `&&` may be applied to operands of boolean type. The
S
Steve Klabnik 已提交
2860
`||` operator denotes logical 'or', and the `&&` operator denotes logical
S
Steve Klabnik 已提交
2861
'and'. They differ from `|` and `&` in that the right-hand operand is only
S
Steve Klabnik 已提交
2862
evaluated when the left-hand operand does not already determine the result of
S
Steve Klabnik 已提交
2863
the expression. That is, `||` only evaluates its right-hand operand when the
S
Steve Klabnik 已提交
2864 2865 2866 2867 2868 2869 2870
left-hand operand evaluates to `false`, and `&&` only when it evaluates to
`true`.

#### Comparison operators

Comparison operators are, like the [arithmetic
operators](#arithmetic-operators), and [bitwise operators](#bitwise-operators),
S
Steve Klabnik 已提交
2871 2872
syntactic sugar for calls to built-in traits. This means that comparison
operators can be overridden for user-defined types. The default meaning of the
S
Steve Klabnik 已提交
2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900
operators on standard types is given here.

* `==`
  : Equal to.
    Calls the `eq` method on the `std::cmp::PartialEq` trait.
* `!=`
  : Unequal to.
    Calls the `ne` method on the `std::cmp::PartialEq` trait.
* `<`
  : Less than.
    Calls the `lt` method on the `std::cmp::PartialOrd` trait.
* `>`
  : Greater than.
    Calls the `gt` method on the `std::cmp::PartialOrd` trait.
* `<=`
  : Less than or equal.
    Calls the `le` method on the `std::cmp::PartialOrd` trait.
* `>=`
  : Greater than or equal.
    Calls the `ge` method on the `std::cmp::PartialOrd` trait.

#### Type cast expressions

A type cast expression is denoted with the binary operator `as`.

Executing an `as` expression casts the value on the left-hand side to the type
on the right-hand side.

S
Steve Klabnik 已提交
2901 2902
A numeric value can be cast to any numeric type. A raw pointer value can be
cast to or from any integral type or raw pointer type. Any other cast is
S
Steve Klabnik 已提交
2903 2904 2905 2906
unsupported and will fail to compile.

An example of an `as` expression:

S
Steve Klabnik 已提交
2907
```
S
Steve Klabnik 已提交
2908
# fn sum(v: &[f64]) -> f64 { 0.0 }
2909
# fn len(v: &[f64]) -> i32 { 0 }
S
Steve Klabnik 已提交
2910 2911 2912 2913 2914 2915

fn avg(v: &[f64]) -> f64 {
  let sum: f64 = sum(v);
  let sz: f64 = len(v) as f64;
  return sum / sz;
}
S
Steve Klabnik 已提交
2916
```
S
Steve Klabnik 已提交
2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927

#### Assignment expressions

An _assignment expression_ consists of an
[lvalue](#lvalues,-rvalues-and-temporaries) expression followed by an equals
sign (`=`) and an [rvalue](#lvalues,-rvalues-and-temporaries) expression.

Evaluating an assignment expression [either copies or
moves](#moved-and-copied-types) its right-hand operand to its left-hand
operand.

S
Steve Klabnik 已提交
2928
```
2929
# let mut x = 0;
S
Steve Klabnik 已提交
2930 2931 2932
# let y = 0;

x = y;
S
Steve Klabnik 已提交
2933
```
S
Steve Klabnik 已提交
2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947

#### Compound assignment expressions

The `+`, `-`, `*`, `/`, `%`, `&`, `|`, `^`, `<<`, and `>>` operators may be
composed with the `=` operator. The expression `lval OP= val` is equivalent to
`lval = lval OP val`. For example, `x = x + 1` may be written as `x += 1`.

Any such expression always has the [`unit`](#primitive-types) type.

#### Operator precedence

The precedence of Rust binary operators is ordered as follows, going from
strong to weak:

S
Steve Klabnik 已提交
2948
```{.text .precedence}
S
Steve Klabnik 已提交
2949
as
2950
* / %
S
Steve Klabnik 已提交
2951 2952 2953 2954 2955
+ -
<< >>
&
^
|
2956
== != < > <= >=
S
Steve Klabnik 已提交
2957 2958
&&
||
2959
= ..
S
Steve Klabnik 已提交
2960
```
S
Steve Klabnik 已提交
2961 2962

Operators at the same precedence level are evaluated left-to-right. [Unary
A
Alfie John 已提交
2963 2964
operators](#unary-operator-expressions) have the same precedence level and are
stronger than any of the binary operators.
S
Steve Klabnik 已提交
2965 2966 2967 2968

### Grouped expressions

An expression enclosed in parentheses evaluates to the result of the enclosed
S
Steve Klabnik 已提交
2969
expression. Parentheses can be used to explicitly specify evaluation order
S
Steve Klabnik 已提交
2970 2971
within an expression.

S
Steve Klabnik 已提交
2972
```{.ebnf .gram}
S
Steve Klabnik 已提交
2973
paren_expr : '(' expr ')' ;
S
Steve Klabnik 已提交
2974
```
S
Steve Klabnik 已提交
2975 2976 2977

An example of a parenthesized expression:

S
Steve Klabnik 已提交
2978
```
2979
let x: i32 = (2 + 3) * 4;
S
Steve Klabnik 已提交
2980
```
S
Steve Klabnik 已提交
2981 2982 2983 2984


### Call expressions

S
Steve Klabnik 已提交
2985
```{.ebnf .gram}
S
Steve Klabnik 已提交
2986 2987 2988
expr_list : [ expr [ ',' expr ]* ] ? ;
paren_expr_list : '(' expr_list ')' ;
call_expr : expr paren_expr_list ;
S
Steve Klabnik 已提交
2989
```
S
Steve Klabnik 已提交
2990 2991 2992 2993 2994 2995 2996 2997

A _call expression_ invokes a function, providing zero or more input slots and
an optional reference slot to serve as the function's output, bound to the
`lval` on the right hand side of the call. If the function eventually returns,
then the expression completes.

Some examples of call expressions:

S
Steve Klabnik 已提交
2998
```
2999
# fn add(x: i32, y: i32) -> i32 { 0 }
S
Steve Klabnik 已提交
3000

3001
let x: i32 = add(1i32, 2i32);
A
Alex Crichton 已提交
3002
let pi: Option<f32> = "3.14".parse().ok();
S
Steve Klabnik 已提交
3003
```
S
Steve Klabnik 已提交
3004 3005 3006

### Lambda expressions

S
Steve Klabnik 已提交
3007
```{.ebnf .gram}
S
Steve Klabnik 已提交
3008 3009
ident_list : [ ident [ ',' ident ]* ] ? ;
lambda_expr : '|' ident_list '|' expr ;
S
Steve Klabnik 已提交
3010
```
S
Steve Klabnik 已提交
3011 3012

A _lambda expression_ (sometimes called an "anonymous function expression")
S
Steve Klabnik 已提交
3013
defines a function and denotes it as a value, in a single expression. A lambda
S
Steve Klabnik 已提交
3014 3015 3016 3017
expression is a pipe-symbol-delimited (`|`) list of identifiers followed by an
expression.

A lambda expression denotes a function that maps a list of parameters
S
Steve Klabnik 已提交
3018 3019
(`ident_list`) onto the expression that follows the `ident_list`. The
identifiers in the `ident_list` are the parameters to the function. These
S
Steve Klabnik 已提交
3020 3021 3022 3023 3024 3025 3026
parameters' types need not be specified, as the compiler infers them from
context.

Lambda expressions are most useful when passing functions as arguments to other
functions, as an abbreviation for defining and capturing a separate function.

Significantly, lambda expressions _capture their environment_, which regular
S
Steve Klabnik 已提交
3027 3028
[function definitions](#functions) do not. The exact type of capture depends
on the [function type](#function-types) inferred for the lambda expression. In
S
Steve Klabnik 已提交
3029 3030 3031 3032
the simplest and least-expensive form (analogous to a ```|| { }``` expression),
the lambda expression captures its environment by reference, effectively
borrowing pointers to all outer variables mentioned inside the function.
Alternately, the compiler may infer that a lambda expression should copy or
3033
move values (depending on their type) from the environment into the lambda
S
Steve Klabnik 已提交
3034 3035 3036
expression's captured environment.

In this example, we define a function `ten_times` that takes a higher-order
3037
function argument, and call it with a lambda expression as an argument:
S
Steve Klabnik 已提交
3038

3039
```
3040 3041
fn ten_times<F>(f: F) where F: Fn(i32) {
    let mut i = 0i32;
S
Steve Klabnik 已提交
3042 3043 3044 3045 3046 3047 3048
    while i < 10 {
        f(i);
        i += 1;
    }
}

ten_times(|j| println!("hello, {}", j));
S
Steve Klabnik 已提交
3049
```
S
Steve Klabnik 已提交
3050 3051 3052

### While loops

S
Steve Klabnik 已提交
3053
```{.ebnf .gram}
S
Steve Klabnik 已提交
3054
while_expr : "while" no_struct_literal_expr '{' block '}' ;
S
Steve Klabnik 已提交
3055
```
S
Steve Klabnik 已提交
3056 3057 3058 3059 3060 3061 3062 3063

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:

S
Steve Klabnik 已提交
3064
```
3065
let mut i = 0us;
S
Steve Klabnik 已提交
3066 3067 3068 3069 3070

while i < 10 {
    println!("hello");
    i = i + 1;
}
S
Steve Klabnik 已提交
3071
```
S
Steve Klabnik 已提交
3072 3073 3074 3075 3076

### Infinite loops

A `loop` expression denotes an infinite loop.

S
Steve Klabnik 已提交
3077
```{.ebnf .gram}
S
Steve Klabnik 已提交
3078
loop_expr : [ lifetime ':' ] "loop" '{' block '}';
S
Steve Klabnik 已提交
3079
```
S
Steve Klabnik 已提交
3080

S
Steve Klabnik 已提交
3081
A `loop` expression may optionally have a _label_. If a label is present, then
S
Steve Klabnik 已提交
3082
labeled `break` and `continue` expressions nested within this loop may exit out
S
Steve Klabnik 已提交
3083
of this loop or return control to its head. See [Break
S
Steve Klabnik 已提交
3084 3085 3086 3087 3088
expressions](#break-expressions) and [Continue
expressions](#continue-expressions).

### Break expressions

S
Steve Klabnik 已提交
3089
```{.ebnf .gram}
S
Steve Klabnik 已提交
3090
break_expr : "break" [ lifetime ];
S
Steve Klabnik 已提交
3091
```
S
Steve Klabnik 已提交
3092

S
Steve Klabnik 已提交
3093
A `break` expression has an optional _label_. If the label is absent, then
S
Steve Klabnik 已提交
3094
executing a `break` expression immediately terminates the innermost loop
S
Steve Klabnik 已提交
3095
enclosing it. It is only permitted in the body of a loop. If the label is
S
Steve Klabnik 已提交
3096 3097 3098 3099 3100
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

S
Steve Klabnik 已提交
3101
```{.ebnf .gram}
S
Steve Klabnik 已提交
3102
continue_expr : "continue" [ lifetime ];
S
Steve Klabnik 已提交
3103
```
S
Steve Klabnik 已提交
3104

S
Steve Klabnik 已提交
3105
A `continue` expression has an optional _label_. If the label is absent, then
S
Steve Klabnik 已提交
3106
executing a `continue` expression immediately terminates the current iteration
S
Steve Klabnik 已提交
3107
of the innermost loop enclosing it, returning control to the loop *head*. In
S
Steve Klabnik 已提交
3108
the case of a `while` loop, the head is the conditional expression controlling
S
Steve Klabnik 已提交
3109 3110
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
S
Steve Klabnik 已提交
3111 3112 3113 3114 3115 3116 3117
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.

### For expressions

S
Steve Klabnik 已提交
3118
```{.ebnf .gram}
S
Steve Klabnik 已提交
3119
for_expr : "for" pat "in" no_struct_literal_expr '{' block '}' ;
S
Steve Klabnik 已提交
3120
```
S
Steve Klabnik 已提交
3121 3122 3123 3124 3125 3126

A `for` expression is a syntactic construct for looping over elements provided
by an implementation of `std::iter::Iterator`.

An example of a for loop over the contents of an array:

S
Steve Klabnik 已提交
3127
```
3128
# type Foo = i32;
S
Steve Klabnik 已提交
3129 3130 3131 3132 3133 3134 3135 3136 3137 3138
# fn bar(f: Foo) { }
# let a = 0;
# let b = 0;
# let c = 0;

let v: &[Foo] = &[a, b, c];

for e in v.iter() {
    bar(*e);
}
S
Steve Klabnik 已提交
3139
```
S
Steve Klabnik 已提交
3140 3141 3142

An example of a for loop over a series of integers:

S
Steve Klabnik 已提交
3143
```
3144 3145
# fn bar(b:usize) { }
for i in range(0us, 256) {
S
Steve Klabnik 已提交
3146 3147
    bar(i);
}
S
Steve Klabnik 已提交
3148
```
S
Steve Klabnik 已提交
3149 3150 3151

### If expressions

S
Steve Klabnik 已提交
3152
```{.ebnf .gram}
S
Steve Klabnik 已提交
3153 3154 3155
if_expr : "if" no_struct_literal_expr '{' block '}'
          else_tail ? ;

J
Jakub Wieczorek 已提交
3156
else_tail : "else" [ if_expr | if_let_expr
S
Steve Klabnik 已提交
3157
                   | '{' block '}' ] ;
S
Steve Klabnik 已提交
3158
```
S
Steve Klabnik 已提交
3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171

An `if` expression is a conditional branch in program control. The form of an
`if` expression is a condition expression, followed by a consequent block, any
number of `else if` conditions and blocks, and an optional trailing `else`
block. The condition expressions must have type `bool`. If a condition
expression evaluates to `true`, the consequent block is executed and any
subsequent `else if` or `else` block is skipped. If a condition expression
evaluates to `false`, the consequent block is skipped and any subsequent `else
if` condition is evaluated. If all `if` and `else if` conditions evaluate to
`false` then any `else` block is executed.

### Match expressions

S
Steve Klabnik 已提交
3172
```{.ebnf .gram}
S
Steve Klabnik 已提交
3173 3174 3175 3176 3177
match_expr : "match" no_struct_literal_expr '{' match_arm * '}' ;

match_arm : attribute * match_pat "=>" [ expr "," | '{' block '}' ] ;

match_pat : pat [ '|' pat ] * [ "if" expr ] ? ;
S
Steve Klabnik 已提交
3178
```
S
Steve Klabnik 已提交
3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191

A `match` expression branches on a *pattern*. The exact form of matching that
occurs depends on the pattern. Patterns consist of some combination of
literals, destructured arrays or enum constructors, structures and tuples,
variable binding specifications, wildcards (`..`), and placeholders (`_`). A
`match` expression has a *head expression*, which is the value to compare to
the patterns. The type of the patterns must equal the type of the head
expression.

In a pattern whose head expression has an `enum` type, a placeholder (`_`)
stands for a *single* data field, whereas a wildcard `..` stands for *all* the
fields of a particular variant. For example:

S
Steve Klabnik 已提交
3192
```
A
Alex Crichton 已提交
3193
#![feature(box_syntax)]
S
Steve Klabnik 已提交
3194 3195
enum List<X> { Nil, Cons(X, Box<List<X>>) }

A
Alex Crichton 已提交
3196
fn main() {
3197
    let x: List<i32> = List::Cons(10, box List::Cons(11, box List::Nil));
S
Steve Klabnik 已提交
3198

A
Alex Crichton 已提交
3199 3200 3201 3202 3203
    match x {
        List::Cons(_, box List::Nil) => panic!("singleton list"),
        List::Cons(..)               => return,
        List::Nil                    => panic!("empty list")
    }
S
Steve Klabnik 已提交
3204
}
S
Steve Klabnik 已提交
3205
```
S
Steve Klabnik 已提交
3206 3207 3208 3209 3210 3211 3212 3213

The first pattern matches lists constructed by applying `Cons` to any head
value, and a tail value of `box Nil`. The second pattern matches _any_ list
constructed with `Cons`, ignoring the values of its arguments. The difference
between `_` and `..` is that the pattern `C(_)` is only type-correct if `C` has
exactly one argument, while the pattern `C(..)` is type-correct for any enum
variant `C`, regardless of how many arguments `C` has.

A
Alex Gaynor 已提交
3214
Used inside an array pattern, `..` stands for any number of elements, when the
S
Steve Klabnik 已提交
3215 3216 3217
`advanced_slice_patterns` feature gate is turned on. This wildcard can be used
at most once for a given array, which implies that it cannot be used to
specifically match elements that are at an unknown distance from both ends of a
A
Alfie John 已提交
3218
array, like `[.., 42, ..]`. If preceded by a variable name, it will bind the
S
Steve Klabnik 已提交
3219 3220
corresponding slice to the variable. Example:

S
Steve Klabnik 已提交
3221
```
S
Steve Klabnik 已提交
3222
# #![feature(advanced_slice_patterns)]
3223
fn is_symmetric(list: &[u32]) -> bool {
S
Steve Klabnik 已提交
3224 3225 3226 3227 3228 3229 3230 3231
    match list {
        [] | [_]                   => true,
        [x, inside.., y] if x == y => is_symmetric(inside),
        _                          => false
    }
}

fn main() {
A
Alex Crichton 已提交
3232 3233
    let sym     = &[0, 1, 4, 2, 4, 1, 0];
    let not_sym = &[0, 1, 7, 2, 4, 1, 0];
S
Steve Klabnik 已提交
3234 3235 3236
    assert!(is_symmetric(sym));
    assert!(!is_symmetric(not_sym));
}
S
Steve Klabnik 已提交
3237
```
S
Steve Klabnik 已提交
3238 3239

A `match` behaves differently depending on whether or not the head expression
S
Steve Klabnik 已提交
3240
is an [lvalue or an rvalue](#lvalues,-rvalues-and-temporaries). If the head
S
Steve Klabnik 已提交
3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254
expression is an rvalue, it is first evaluated into a temporary location, and
the resulting value is sequentially compared to the patterns in the arms until
a match is found. The first arm with a matching pattern is chosen as the branch
target of the `match`, any variables bound by the pattern are assigned to local
variables in the arm's block, and control enters the block.

When the head expression is an lvalue, the match does not allocate a temporary
location (however, a by-value binding may copy or move from the lvalue). When
possible, it is preferable to match on lvalues, as the lifetime of these
matches inherits the lifetime of the lvalue, rather than being restricted to
the inside of the match.

An example of a `match` expression:

S
Steve Klabnik 已提交
3255
```
A
Alex Crichton 已提交
3256
#![feature(box_syntax)]
3257
# fn process_pair(a: i32, b: i32) { }
S
Steve Klabnik 已提交
3258 3259 3260 3261
# fn process_ten() { }

enum List<X> { Nil, Cons(X, Box<List<X>>) }

A
Alex Crichton 已提交
3262
fn main() {
3263
    let x: List<i32> = List::Cons(10, box List::Cons(11, box List::Nil));
S
Steve Klabnik 已提交
3264

A
Alex Crichton 已提交
3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277
    match x {
        List::Cons(a, box List::Cons(b, _)) => {
            process_pair(a, b);
        }
        List::Cons(10, _) => {
            process_ten();
        }
        List::Nil => {
            return;
        }
        _ => {
            panic!();
        }
S
Steve Klabnik 已提交
3278 3279
    }
}
S
Steve Klabnik 已提交
3280
```
S
Steve Klabnik 已提交
3281 3282

Patterns that bind variables default to binding to a copy or move of the
S
Steve Klabnik 已提交
3283
matched value (depending on the matched value's type). This can be changed to
S
Steve Klabnik 已提交
3284 3285 3286 3287 3288 3289
bind to a reference by using the `ref` keyword, or to a mutable reference using
`ref mut`.

Subpatterns can also be bound to variables by the use of the syntax `variable @
subpattern`. For example:

S
Steve Klabnik 已提交
3290
```
A
Alex Crichton 已提交
3291 3292
#![feature(box_syntax)]

S
Steve Klabnik 已提交
3293 3294 3295 3296
enum List { Nil, Cons(uint, Box<List>) }

fn is_sorted(list: &List) -> bool {
    match *list {
S
Steven Fackler 已提交
3297 3298
        List::Nil | List::Cons(_, box List::Nil) => true,
        List::Cons(x, ref r @ box List::Cons(_, _)) => {
S
Steve Klabnik 已提交
3299
            match *r {
S
Steven Fackler 已提交
3300
                box List::Cons(y, _) => (x <= y) && is_sorted(&**r),
S
Steve Klabnik 已提交
3301
                _ => panic!()
S
Steve Klabnik 已提交
3302 3303 3304 3305 3306 3307
            }
        }
    }
}

fn main() {
S
Steven Fackler 已提交
3308
    let a = List::Cons(6, box List::Cons(7, box List::Cons(42, box List::Nil)));
S
Steve Klabnik 已提交
3309 3310 3311
    assert!(is_sorted(&a));
}

S
Steve Klabnik 已提交
3312
```
S
Steve Klabnik 已提交
3313

3314
Patterns can also dereference pointers by using the `&`, `&mut` and `box`
3315
symbols, as appropriate. For example, these two matches on `x: &i32` are
3316
equivalent:
S
Steve Klabnik 已提交
3317

S
Steve Klabnik 已提交
3318
```
3319
# let x = &3;
S
Steve Klabnik 已提交
3320 3321 3322 3323
let y = match *x { 0 => "zero", _ => "some" };
let z = match x { &0 => "zero", _ => "some" };

assert_eq!(y, z);
S
Steve Klabnik 已提交
3324
```
S
Steve Klabnik 已提交
3325 3326

A pattern that's just an identifier, like `Nil` in the previous example, could
S
Steve Klabnik 已提交
3327
either refer to an enum variant that's in scope, or bind a new variable. The
S
Steve Klabnik 已提交
3328
compiler resolves this ambiguity by forbidding variable bindings that occur in
S
Steve Klabnik 已提交
3329
`match` patterns from shadowing names of variants that are in scope. For
S
Steve Klabnik 已提交
3330
example, wherever `List` is in scope, a `match` pattern would not be able to
S
Steve Klabnik 已提交
3331 3332
bind `Nil` as a new name. The compiler interprets a variable pattern `x` as a
binding _only_ if there is no variant named `x` in scope. A convention you can
S
Steve Klabnik 已提交
3333 3334 3335
use to avoid conflicts is simply to name variants with upper-case letters, and
local variables with lower-case letters.

S
Steve Klabnik 已提交
3336
Multiple match patterns may be joined with the `|` operator. A range of values
3337
may be specified with `...`. For example:
S
Steve Klabnik 已提交
3338

S
Steve Klabnik 已提交
3339
```
3340
# let x = 2;
S
Steve Klabnik 已提交
3341 3342 3343

let message = match x {
  0 | 1  => "not many",
3344
  2 ... 9 => "a few",
S
Steve Klabnik 已提交
3345 3346
  _      => "lots"
};
S
Steve Klabnik 已提交
3347
```
S
Steve Klabnik 已提交
3348 3349

Range patterns only work on scalar types (like integers and characters; not
S
Steve Klabnik 已提交
3350
like arrays and structs, which have sub-components). A range pattern may not
S
Steve Klabnik 已提交
3351 3352 3353 3354 3355 3356 3357
be a sub-range of another range pattern inside the same `match`.

Finally, match patterns can accept *pattern guards* to further refine the
criteria for matching a case. Pattern guards appear after the pattern and
consist of a bool-typed expression following the `if` keyword. A pattern guard
may refer to the variables bound within the pattern they follow.

S
Steve Klabnik 已提交
3358
```
S
Steve Klabnik 已提交
3359
# let maybe_digit = Some(0);
3360 3361
# fn process_digit(i: i32) { }
# fn process_other(i: i32) { }
S
Steve Klabnik 已提交
3362 3363 3364 3365

let message = match maybe_digit {
  Some(x) if x < 10 => process_digit(x),
  Some(x) => process_other(x),
S
Steve Klabnik 已提交
3366
  None => panic!()
S
Steve Klabnik 已提交
3367
};
S
Steve Klabnik 已提交
3368
```
S
Steve Klabnik 已提交
3369

J
Jakub Wieczorek 已提交
3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382
### If let expressions

```{.ebnf .gram}
if_let_expr : "if" "let" pat '=' expr '{' block '}'
               else_tail ? ;
else_tail : "else" [ if_expr | if_let_expr | '{' block '}' ] ;
```

An `if let` expression is semantically identical to an `if` expression but in place
of a condition expression it expects a refutable let statement. If the value of the
expression on the right hand side of the let statement matches the pattern, the corresponding
block will execute, otherwise flow proceeds to the first `else` block that follows.

J
John Gallagher 已提交
3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394
### While let loops

```{.ebnf .gram}
while_let_expr : "while" "let" pat '=' expr '{' block '}' ;
```

A `while let` loop is semantically identical to a `while` loop but in place of a
condition expression it expects a refutable let statement. If the value of the
expression on the right hand side of the let statement matches the pattern, the
loop body block executes and control returns to the pattern matching statement.
Otherwise, the while expression completes.

S
Steve Klabnik 已提交
3395 3396
### Return expressions

S
Steve Klabnik 已提交
3397
```{.ebnf .gram}
S
Steve Klabnik 已提交
3398
return_expr : "return" expr ? ;
S
Steve Klabnik 已提交
3399
```
S
Steve Klabnik 已提交
3400 3401 3402 3403 3404 3405 3406 3407

Return expressions are denoted with the keyword `return`. Evaluating a `return`
expression moves its argument into the output slot of the current function,
destroys the current function activation frame, and transfers control to the
caller frame.

An example of a `return` expression:

S
Steve Klabnik 已提交
3408
```
3409
fn max(a: i32, b: i32) -> i32 {
S
Steve Klabnik 已提交
3410 3411 3412 3413 3414
   if a > b {
      return a;
   }
   return b;
}
S
Steve Klabnik 已提交
3415
```
S
Steve Klabnik 已提交
3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460

# Type system

## Types

Every slot, item and value in a Rust program has a type. The _type_ of a
*value* defines the interpretation of the memory holding it.

Built-in types and type-constructors are tightly integrated into the language,
in nontrivial ways that are not possible to emulate in user-defined types.
User-defined types have limited capabilities.

### Primitive types

The primitive types are the following:

* The "unit" type `()`, having the single "unit" value `()` (occasionally called
  "nil"). [^unittype]
* The boolean type `bool` with values `true` and `false`.
* The machine types.
* The machine-dependent integer and floating-point types.

[^unittype]: The "unit" value `()` is *not* a sentinel "null pointer" value for
    reference slots; the "unit" type is the implicit return type from functions
    otherwise lacking a return type, and can be used in other contexts (such as
    message-sending or type-parametric code) as a zero-size type.]

#### Machine types

The machine types are the following:

* The unsigned word types `u8`, `u16`, `u32` and `u64`, with values drawn from
  the integer intervals [0, 2^8 - 1], [0, 2^16 - 1], [0, 2^32 - 1] and
  [0, 2^64 - 1] respectively.

* The signed two's complement word types `i8`, `i16`, `i32` and `i64`, with
  values drawn from the integer intervals [-(2^(7)), 2^7 - 1],
  [-(2^(15)), 2^15 - 1], [-(2^(31)), 2^31 - 1], [-(2^(63)), 2^63 - 1]
  respectively.

* The IEEE 754-2008 `binary32` and `binary64` floating-point types: `f32` and
  `f64`, respectively.

#### Machine-dependent integer types

3461
The `usize` type is an unsigned integer type with the same number of bits as the
3462 3463
platform's pointer type. It can represent every memory address in the process.

3464
The `isize` type is a signed integer type with the same number of bits as the
3465
platform's pointer type. The theoretical upper bound on object and array size
3466
is the maximum `isize` value. This ensures that `isize` can be used to calculate
3467 3468
differences between pointers into an object or array and can address every byte
within an object along with one byte past the end.
S
Steve Klabnik 已提交
3469 3470 3471 3472 3473 3474

### Textual types

The types `char` and `str` hold textual data.

A value of type `char` is a [Unicode scalar value](
3475
http://www.unicode.org/glossary/#unicode_scalar_value) (i.e. a code point that
S
Steve Klabnik 已提交
3476
is not a surrogate), represented as a 32-bit unsigned word in the 0x0000 to
S
Steve Klabnik 已提交
3477
0xD7FF or 0xE000 to 0x10FFFF range. A `[char]` array is effectively an UCS-4 /
S
Steve Klabnik 已提交
3478 3479
UTF-32 string.

A
Alex Gaynor 已提交
3480
A value of type `str` is a Unicode string, represented as an array of 8-bit
S
Steve Klabnik 已提交
3481
unsigned bytes holding a sequence of UTF-8 codepoints. Since `str` is of
3482
unknown size, it is not a _first-class_ type, but can only be instantiated
S
Steve Klabnik 已提交
3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500
through a pointer type, such as `&str` or `String`.

### Tuple types

A tuple *type* is a heterogeneous product of other types, called the *elements*
of the tuple. It has no nominal name and is instead structurally typed.

Tuple types and values are denoted by listing the types or values of their
elements, respectively, in a parenthesized, comma-separated list.

Because tuple elements don't have a name, they can only be accessed by
pattern-matching.

The members of a tuple are laid out in memory contiguously, in order specified
by the tuple type.

An example of a tuple type and its use:

S
Steve Klabnik 已提交
3501
```
3502
type Pair<'a> = (i32, &'a str);
S
Steve Klabnik 已提交
3503 3504 3505
let p: Pair<'static> = (10, "hello");
let (a, b) = p;
assert!(b != "world");
S
Steve Klabnik 已提交
3506
```
S
Steve Klabnik 已提交
3507

S
Steve Klabnik 已提交
3508
### Array, and Slice types
S
Steve Klabnik 已提交
3509

S
Steve Klabnik 已提交
3510
Rust has two different types for a list of items:
S
Steve Klabnik 已提交
3511

3512
* `[T; N]`, an 'array'.
S
Steve Klabnik 已提交
3513 3514 3515 3516 3517
* `&[T]`, a 'slice'.

An array has a fixed size, and can be allocated on either the stack or the
heap.

S
Steve Klabnik 已提交
3518
A slice is a 'view' into an array. It doesn't own the data it points
S
Steve Klabnik 已提交
3519 3520 3521 3522 3523
to, it borrows it.

An example of each kind:

```{rust}
3524 3525
let vec: Vec<i32> = vec![1, 2, 3];
let arr: [i32; 3] = [1, 2, 3];
S
Steve Klabnik 已提交
3526
let s: &[i32] = &vec;
S
Steve Klabnik 已提交
3527 3528 3529 3530 3531
```

As you can see, the `vec!` macro allows you to create a `Vec<T>` easily. The
`vec!` macro is also part of the standard library, rather than the language.

S
Steve Klabnik 已提交
3532 3533
All in-bounds elements of arrays, and slices are always initialized, and access
to an array or slice is always bounds-checked.
S
Steve Klabnik 已提交
3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548

### Structure types

A `struct` *type* is a heterogeneous product of other types, called the
*fields* of the type.[^structtype]

[^structtype]: `struct` types are analogous `struct` types in C,
    the *record* types of the ML family,
    or the *structure* types of the Lisp family.

New instances of a `struct` can be constructed with a [struct
expression](#structure-expressions).

The memory layout of a `struct` is undefined by default to allow for compiler
optimizations like field reordering, but it can be fixed with the
S
Steve Klabnik 已提交
3549
`#[repr(...)]` attribute. In either case, fields may be given in any order in
S
Steve Klabnik 已提交
3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560
a corresponding struct *expression*; the resulting `struct` value will always
have the same memory layout.

The fields of a `struct` may be qualified by [visibility
modifiers](#re-exporting-and-visibility), to allow access to data in a
structure outside a module.

A _tuple struct_ type is just like a structure type, except that the fields are
anonymous.

A _unit-like struct_ type is like a structure type, except that it has no
S
Steve Klabnik 已提交
3561
fields. The one value constructed by the associated [structure
S
Steve Klabnik 已提交
3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588
expression](#structure-expressions) is the only value that inhabits such a
type.

### Enumerated types

An *enumerated type* is a nominal, heterogeneous disjoint union type, denoted
by the name of an [`enum` item](#enumerations). [^enumtype]

[^enumtype]: The `enum` type is analogous to a `data` constructor declaration in
             ML, or a *pick ADT* in Limbo.

An [`enum` item](#enumerations) declares both the type and a number of *variant
constructors*, each of which is independently named and takes an optional tuple
of arguments.

New instances of an `enum` can be constructed by calling one of the variant
constructors, in a [call expression](#call-expressions).

Any `enum` value consumes as much memory as the largest variant constructor for
its corresponding `enum` type.

Enum types cannot be denoted *structurally* as types, but must be denoted by
named reference to an [`enum` item](#enumerations).

### Recursive types

Nominal types &mdash; [enumerations](#enumerated-types) and
S
Steve Klabnik 已提交
3589
[structures](#structure-types) &mdash; may be recursive. That is, each `enum`
S
Steve Klabnik 已提交
3590
constructor or `struct` field may refer, directly or indirectly, to the
S
Steve Klabnik 已提交
3591
enclosing `enum` or `struct` type itself. Such recursion has restrictions:
S
Steve Klabnik 已提交
3592 3593 3594

* Recursive types must include a nominal type in the recursion
  (not mere [type definitions](#type-definitions),
S
Steve Klabnik 已提交
3595
   or other structural types such as [arrays](#array,-and-slice-types) or [tuples](#tuple-types)).
S
Steve Klabnik 已提交
3596 3597 3598 3599 3600 3601 3602 3603 3604
* A recursive `enum` item must have at least one non-recursive constructor
  (in order to give the recursion a basis case).
* The size of a recursive type must be finite;
  in other words the recursive fields of the type must be [pointer types](#pointer-types).
* Recursive type definitions can cross module boundaries, but not module *visibility* boundaries,
  or crate boundaries (in order to simplify the module system and type checker).

An example of a *recursive* type and its use:

S
Steve Klabnik 已提交
3605
```
S
Steve Klabnik 已提交
3606
enum List<T> {
A
Alex Crichton 已提交
3607 3608
    Nil,
    Cons(T, Box<List<T>>)
S
Steve Klabnik 已提交
3609 3610
}

3611
let a: List<i32> = List::Cons(7, Box::new(List::Cons(13, Box::new(List::Nil))));
S
Steve Klabnik 已提交
3612
```
S
Steve Klabnik 已提交
3613 3614 3615

### Pointer types

S
Steve Klabnik 已提交
3616 3617
All pointers in Rust are explicit first-class values. They can be copied,
stored into data structures, and returned from functions. There are two
S
Steve Klabnik 已提交
3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634
varieties of pointer in Rust:

* References (`&`)
  : These point to memory _owned by some other value_.
    A reference type is written `&type` for some lifetime-variable `f`,
    or just `&'a type` when you need an explicit lifetime.
    Copying a reference is a "shallow" operation:
    it involves only copying the pointer itself.
    Releasing a reference typically has no effect on the value it points to,
    with the exception of temporary values, which are released when the last
    reference to them is released.

* Raw pointers (`*`)
  : Raw pointers are pointers without safety or liveness guarantees.
    Raw pointers are written as `*const T` or `*mut T`,
    for example `*const int` means a raw pointer to an integer.
    Copying or dropping a raw pointer has no effect on the lifecycle of any
S
Steve Klabnik 已提交
3635
    other value. Dereferencing a raw pointer or converting it to any other
S
Steve Klabnik 已提交
3636 3637 3638 3639 3640 3641 3642 3643 3644 3645
    pointer type is an [`unsafe` operation](#unsafe-functions).
    Raw pointers are generally discouraged in Rust code;
    they exist to support interoperability with foreign code,
    and writing performance-critical or low-level functions.

The standard library contains additional 'smart pointer' types beyond references
and raw pointers.

### Function types

S
Steve Klabnik 已提交
3646
The function type constructor `fn` forms new function types. A function type
S
Steve Klabnik 已提交
3647 3648 3649 3650 3651
consists of a possibly-empty set of function-type modifiers (such as `unsafe`
or `extern`), a sequence of input types and an output type.

An example of a `fn` type:

3652
```
3653
fn add(x: i32, y: i32) -> i32 {
S
Steve Klabnik 已提交
3654 3655 3656 3657 3658
  return x + y;
}

let mut x = add(5,7);

3659
type Binop = fn(i32, i32) -> i32;
S
Steve Klabnik 已提交
3660 3661
let bo: Binop = add;
x = bo(5,7);
S
Steve Klabnik 已提交
3662
```
S
Steve Klabnik 已提交
3663 3664 3665

### Closure types

S
Steve Klabnik 已提交
3666
```{.ebnf .notation}
S
Steve Klabnik 已提交
3667 3668 3669 3670 3671 3672
closure_type := [ 'unsafe' ] [ '<' lifetime-list '>' ] '|' arg-list '|'
                [ ':' bound-list ] [ '->' type ]
lifetime-list := lifetime | lifetime ',' lifetime-list
arg-list := ident ':' type | ident ':' type ',' arg-list
bound-list := bound | bound '+' bound-list
bound := path | lifetime
S
Steve Klabnik 已提交
3673
```
S
Steve Klabnik 已提交
3674 3675 3676 3677 3678 3679

The type of a closure mapping an input of type `A` to an output of type `B` is
`|A| -> B`. A closure with no arguments or return values has type `||`.

An example of creating and calling a closure:

3680
```rust
3681
let captured_var = 10;
S
Steve Klabnik 已提交
3682

3683
let closure_no_args = |&:| println!("captured_var={}", captured_var);
S
Steve Klabnik 已提交
3684

3685
let closure_args = |&: arg: i32| -> i32 {
S
Steve Klabnik 已提交
3686 3687 3688 3689
  println!("captured_var={}, arg={}", captured_var, arg);
  arg // Note lack of semicolon after 'arg'
};

3690
fn call_closure<F: Fn(), G: Fn(i32) -> i32>(c1: F, c2: G) {
S
Steve Klabnik 已提交
3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701
  c1();
  c2(2);
}

call_closure(closure_no_args, closure_args);

```

### Object types

Every trait item (see [traits](#traits)) defines a type with the same name as
S
Steve Klabnik 已提交
3702
the trait. This type is called the _object type_ of the trait. Object types
S
Steve Klabnik 已提交
3703
permit "late binding" of methods, dispatched using _virtual method tables_
S
Steve Klabnik 已提交
3704
("vtables"). Whereas most calls to trait methods are "early bound" (statically
S
Steve Klabnik 已提交
3705
resolved) to specific implementations at compile time, a call to a method on an
S
Steve Klabnik 已提交
3706
object type is only resolved to a vtable entry at compile time. The actual
S
Steve Klabnik 已提交
3707 3708 3709 3710
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
S
Steve Klabnik 已提交
3711
`Box<R>` results in a value of the _object type_ `R`. This result is
S
Steve Klabnik 已提交
3712 3713 3714 3715 3716
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:

S
Steve Klabnik 已提交
3717
```
S
Steve Klabnik 已提交
3718 3719 3720 3721
trait Printable {
  fn stringify(&self) -> String;
}

3722
impl Printable for i32 {
S
Steve Klabnik 已提交
3723 3724 3725 3726 3727 3728 3729 3730
  fn stringify(&self) -> String { self.to_string() }
}

fn print(a: Box<Printable>) {
   println!("{}", a.stringify());
}

fn main() {
3731
   print(Box::new(10) as Box<Printable>);
S
Steve Klabnik 已提交
3732
}
S
Steve Klabnik 已提交
3733
```
S
Steve Klabnik 已提交
3734 3735 3736 3737 3738 3739 3740 3741 3742

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

### Type parameters

Within the body of an item that has type parameter declarations, the names of
its type parameters are types:

3743
```ignore
S
Steve Klabnik 已提交
3744 3745 3746 3747 3748 3749 3750 3751 3752
fn map<A: Clone, B: Clone>(f: |A| -> B, xs: &[A]) -> Vec<B> {
    if xs.len() == 0 {
       return vec![];
    }
    let first: B = f(xs[0].clone());
    let mut rest: Vec<B> = map(f, xs.slice(1, xs.len()));
    rest.insert(0, first);
    return rest;
}
S
Steve Klabnik 已提交
3753
```
S
Steve Klabnik 已提交
3754 3755 3756 3757 3758 3759 3760 3761 3762

Here, `first` has type `B`, referring to `map`'s `B` type parameter; and `rest`
has type `Vec<B>`, a vector type with element type `B`.

### Self types

The special type `self` has a meaning within methods inside an impl item. It
refers to the type of the implicit `self` argument. For example, in:

S
Steve Klabnik 已提交
3763
```
S
Steve Klabnik 已提交
3764 3765 3766 3767 3768 3769 3770 3771 3772
trait Printable {
  fn make_string(&self) -> String;
}

impl Printable for String {
    fn make_string(&self) -> String {
        (*self).clone()
    }
}
S
Steve Klabnik 已提交
3773
```
S
Steve Klabnik 已提交
3774 3775 3776 3777 3778 3779 3780

`self` refers to the value of type `String` that is the receiver for a call to
the method `make_string`.

## Type kinds

Types in Rust are categorized into kinds, based on various properties of the
S
Steve Klabnik 已提交
3781
components of the type. The kinds are:
S
Steve Klabnik 已提交
3782 3783

* `Send`
S
Steve Klabnik 已提交
3784
  : Types of this kind can be safely sent between threads.
3785
    This kind includes scalars, boxes, procs, and
S
Steve Klabnik 已提交
3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821
    structural types containing only other owned types.
    All `Send` types are `'static`.
* `Copy`
  : Types of this kind consist of "Plain Old Data"
    which can be copied by simply moving bits.
    All values of this kind can be implicitly copied.
    This kind includes scalars and immutable references,
    as well as structural types containing other `Copy` types.
* `'static`
  : Types of this kind do not contain any references (except for
    references with the `static` lifetime, which are allowed).
    This can be a useful guarantee for code
    that breaks borrowing assumptions
    using [`unsafe` operations](#unsafe-functions).
* `Drop`
  : This is not strictly a kind,
    but its presence interacts with kinds:
    the `Drop` trait provides a single method `drop`
    that takes no parameters,
    and is run when values of the type are dropped.
    Such a method is called a "destructor",
    and are always executed in "top-down" order:
    a value is completely destroyed
    before any of the values it owns run their destructors.
    Only `Send` types can implement `Drop`.

* _Default_
  : Types with destructors, closure environments,
    and various other _non-first-class_ types,
    are not copyable at all.
    Such types can usually only be accessed through pointers,
    or in some cases, moved between mutable locations.

Kinds can be supplied as _bounds_ on type parameters, like traits, in which
case the parameter is constrained to types satisfying that kind.

S
Steve Klabnik 已提交
3822
By default, type parameters do not carry any assumed kind-bounds at all. When
S
Steve Klabnik 已提交
3823 3824 3825 3826 3827 3828 3829 3830 3831
instantiating a type parameter, the kind bounds on the parameter are checked to
be the same or narrower than the kind of the type that it is instantiated with.

Sending operations are not part of the Rust language, but are implemented in
the library. Generic functions that send values bound the kind of these values
to sendable.

# Memory and concurrency models

S
Steve Klabnik 已提交
3832
Rust has a memory model centered around concurrently-executing _threads_. Thus
S
Steve Klabnik 已提交
3833 3834 3835 3836 3837
its memory model and its concurrency model are best discussed simultaneously,
as parts of each only make sense when considered from the perspective of the
other.

When reading about the memory model, keep in mind that it is partitioned in
S
Steve Klabnik 已提交
3838
order to support threads; and when reading about threads, keep in mind that their
S
Steve Klabnik 已提交
3839 3840 3841 3842 3843 3844
isolation and communication mechanisms are only possible due to the ownership
and lifetime semantics of the memory model.

## Memory model

A Rust program's memory consists of a static set of *items*, a set of
S
Steve Klabnik 已提交
3845 3846
[threads](#threads) each with its own *stack*, and a *heap*. Immutable portions of
the heap may be shared between threads, mutable portions may not.
S
Steve Klabnik 已提交
3847 3848 3849 3850 3851 3852 3853 3854 3855 3856

Allocations in the stack consist of *slots*, and allocations in the heap
consist of *boxes*.

### Memory allocation and lifetime

The _items_ of a program are those functions, modules and types that have their
value calculated at compile-time and stored uniquely in the memory image of the
rust process. Items are neither dynamically allocated nor freed.

S
Steve Klabnik 已提交
3857 3858
A thread's _stack_ consists of activation frames automatically allocated on entry
to each function as the thread executes. A stack allocation is reclaimed when
S
Steve Klabnik 已提交
3859 3860
control leaves the frame containing it.

S
Steve Klabnik 已提交
3861 3862 3863 3864
The _heap_ is a general term that describes boxes.  The lifetime of an
allocation in the heap depends on the lifetime of the box values pointing to
it. Since box values may themselves be passed in and out of frames, or stored
in the heap, heap allocations may outlive the frame they are allocated within.
S
Steve Klabnik 已提交
3865 3866 3867

### Memory ownership

S
Steve Klabnik 已提交
3868
A thread owns all memory it can *safely* reach through local variables, as well
S
Steve Klabnik 已提交
3869
as boxes and references.
S
Steve Klabnik 已提交
3870

S
Steve Klabnik 已提交
3871
When a thread sends a value that has the `Send` trait to another thread, it loses
S
Steve Klabnik 已提交
3872
ownership of the value sent and can no longer refer to it. This is statically
S
Steve Klabnik 已提交
3873 3874
guaranteed by the combined use of "move semantics", and the compiler-checked
_meaning_ of the `Send` trait: it is only instantiated for (transitively)
S
Steve Klabnik 已提交
3875
sendable kinds of data constructor and pointers, never including references.
S
Steve Klabnik 已提交
3876 3877

When a stack frame is exited, its local allocations are all released, and its
S
Steve Klabnik 已提交
3878
references to boxes are dropped.
S
Steve Klabnik 已提交
3879

S
Steve Klabnik 已提交
3880
When a thread finishes, its stack is necessarily empty and it therefore has no
S
Steve Klabnik 已提交
3881 3882 3883 3884
references to any boxes; the remainder of its heap is immediately freed.

### Memory slots

S
Steve Klabnik 已提交
3885
A thread's stack contains slots.
S
Steve Klabnik 已提交
3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896

A _slot_ is a component of a stack frame, either a function parameter, a
[temporary](#lvalues,-rvalues-and-temporaries), or a local variable.

A _local variable_ (or *stack-local* allocation) holds a value directly,
allocated within the stack's memory. The value is a part of the stack frame.

Local variables are immutable unless declared otherwise like: `let mut x = ...`.

Function parameters are immutable unless declared with `mut`. The `mut` keyword
applies only to the following parameter (so `|mut x, y|` and `fn f(mut x:
3897
Box<i32>, y: Box<i32>)` declare one mutable variable `x` and one immutable
S
Steve Klabnik 已提交
3898 3899 3900 3901 3902
variable `y`).

Methods that take either `self` or `Box<Self>` can optionally place them in a
mutable slot by prefixing them with `mut` (similar to regular arguments):

S
Steve Klabnik 已提交
3903
```
S
Steve Klabnik 已提交
3904 3905 3906 3907
trait Changer {
    fn change(mut self) -> Self;
    fn modify(mut self: Box<Self>) -> Box<Self>;
}
S
Steve Klabnik 已提交
3908
```
S
Steve Klabnik 已提交
3909 3910 3911 3912 3913 3914 3915

Local variables are not initialized when allocated; the entire frame worth of
local variables are allocated at once, on frame-entry, in an uninitialized
state. Subsequent statements within a function may or may not initialize the
local variables. Local variables can be used only after they have been
initialized; this is enforced by the compiler.

S
Steve Klabnik 已提交
3916
### Boxes
S
Steve Klabnik 已提交
3917

3918
A _box_ is a reference to a heap allocation holding another value, which is
S
Steve Klabnik 已提交
3919
constructed by the prefix operator `box`. When the standard library is in use,
3920
the type of a box is `std::owned::Box<T>`.
S
Steve Klabnik 已提交
3921

3922
An example of a box type and value:
S
Steve Klabnik 已提交
3923

S
Steve Klabnik 已提交
3924
```
3925
let x: Box<i32> = Box::new(10);
S
Steve Klabnik 已提交
3926
```
S
Steve Klabnik 已提交
3927

3928
Box values exist in 1:1 correspondence with their heap allocation, copying a
S
Steve Klabnik 已提交
3929
box value makes a shallow copy of the pointer. Rust will consider a shallow
3930
copy of a box to move ownership of the value. After a value has been moved,
S
Steve Klabnik 已提交
3931
the source location cannot be used unless it is reinitialized.
S
Steve Klabnik 已提交
3932

S
Steve Klabnik 已提交
3933
```
3934
let x: Box<i32> = Box::new(10);
S
Steve Klabnik 已提交
3935 3936
let y = x;
// attempting to use `x` will result in an error here
S
Steve Klabnik 已提交
3937
```
S
Steve Klabnik 已提交
3938

S
Steve Klabnik 已提交
3939
## Threads
S
Steve Klabnik 已提交
3940

S
Steve Klabnik 已提交
3941
Rust's primary concurrency mechanism is called a **thread**.
S
Steve Klabnik 已提交
3942

S
Steve Klabnik 已提交
3943
### Communication between threads
S
Steve Klabnik 已提交
3944

S
Steve Klabnik 已提交
3945
Rust threads are isolated and generally unable to interfere with one another's
3946
memory directly, except through [`unsafe` code](#unsafe-functions).  All
S
Steve Klabnik 已提交
3947
contact between threads is mediated by safe forms of ownership transfer, and data
3948 3949
races on memory are prohibited by the type system.

S
Steve Klabnik 已提交
3950
When you wish to send data between threads, the values are restricted to the
3951
[`Send` type-kind](#type-kinds). Restricting communication interfaces to this
S
Steve Klabnik 已提交
3952
kind ensures that no references move between threads. Thus access to an entire
S
Steve Klabnik 已提交
3953 3954 3955
data structure can be mediated through its owning "root" value; no further
locking or copying is required to avoid data races within the substructure of
such a value.
S
Steve Klabnik 已提交
3956

S
Steve Klabnik 已提交
3957
### Thread
S
Steve Klabnik 已提交
3958

S
Steve Klabnik 已提交
3959 3960
The _lifecycle_ of a threads consists of a finite set of states and events that
cause transitions between the states. The lifecycle states of a thread are:
S
Steve Klabnik 已提交
3961 3962 3963

* running
* blocked
3964
* panicked
S
Steve Klabnik 已提交
3965 3966
* dead

S
Steve Klabnik 已提交
3967
A thread begins its lifecycle &mdash; once it has been spawned &mdash; in the
S
Steve Klabnik 已提交
3968 3969 3970
*running* state. In this state it executes the statements of its entry
function, and any functions called by the entry function.

S
Steve Klabnik 已提交
3971
A thread may transition from the *running* state to the *blocked* state any time
S
Steve Klabnik 已提交
3972 3973
it makes a blocking communication call. When the call can be completed &mdash;
when a message arrives at a sender, or a buffer opens to receive a message
S
Steve Klabnik 已提交
3974
&mdash; then the blocked thread will unblock and transition back to *running*.
S
Steve Klabnik 已提交
3975

S
Steve Klabnik 已提交
3976
A thread may transition to the *panicked* state at any time, due being killed by
S
Steve Klabnik 已提交
3977
some external event or internally, from the evaluation of a `panic!()` macro.
S
Steve Klabnik 已提交
3978 3979
Once *panicking*, a thread unwinds its stack and transitions to the *dead* state.
Unwinding the stack of a thread is done by the thread itself, on its own control
S
Steve Klabnik 已提交
3980
stack. If a value with a destructor is freed during unwinding, the code for the
S
Steve Klabnik 已提交
3981
destructor is run, also on the thread's control stack. Running the destructor
S
Steve Klabnik 已提交
3982
code causes a temporary transition to a *running* state, and allows the
3983
destructor code to cause any subsequent state transitions. The original thread
S
Steve Klabnik 已提交
3984
of unwinding and panicking thereby may suspend temporarily, and may involve
S
Steve Klabnik 已提交
3985 3986
(recursive) unwinding of the stack of a failed destructor. Nonetheless, the
outermost unwinding activity will continue until the stack is unwound and the
3987
thread transitions to the *dead* state. There is no way to "recover" from thread
S
Steve Klabnik 已提交
3988
panics. Once a thread has temporarily suspended its unwinding in the *panicking*
S
Steve Klabnik 已提交
3989 3990
state, a panic occurring from within this destructor results in *hard* panic.
A hard panic currently results in the process aborting.
S
Steve Klabnik 已提交
3991

S
Steve Klabnik 已提交
3992 3993
A thread in the *dead* state cannot transition to other states; it exists only to
have its termination status inspected by other threads, and/or to await
S
Steve Klabnik 已提交
3994 3995 3996 3997
reclamation when the last reference to it drops.

# Runtime services, linkage and debugging

S
Steve Klabnik 已提交
3998
The Rust _runtime_ is a relatively compact collection of Rust code that
S
Steve Klabnik 已提交
3999
provides fundamental services and datatypes to all Rust threads at run-time. It
S
Steve Klabnik 已提交
4000
is smaller and simpler than many modern language runtimes. It is tightly
S
Steve Klabnik 已提交
4001
integrated into the language's execution model of memory, threads, communication
S
Steve Klabnik 已提交
4002 4003 4004 4005 4006 4007 4008
and logging.

### Memory allocation

The runtime memory-management system is based on a _service-provider
interface_, through which the runtime requests blocks of memory from its
environment and releases them back to its environment when they are no longer
S
Steve Klabnik 已提交
4009
needed. The default implementation of the service-provider interface consists
S
Steve Klabnik 已提交
4010 4011
of the C runtime functions `malloc` and `free`.

S
Steve Klabnik 已提交
4012
The runtime memory-management system, in turn, supplies Rust threads with
S
Steve Klabnik 已提交
4013 4014 4015 4016 4017 4018 4019
facilities for allocating releasing stacks, as well as allocating and freeing
heap data.

### Built in types

The runtime provides C and Rust code to assist with various built-in types,
such as arrays, strings, and the low level communication system (ports,
S
Steve Klabnik 已提交
4020
channels, threads).
S
Steve Klabnik 已提交
4021 4022 4023 4024

Support for other built-in types such as simple types, tuples and enums is
open-coded by the Rust compiler.

S
Steve Klabnik 已提交
4025
### Thread scheduling and communication
S
Steve Klabnik 已提交
4026

S
Steve Klabnik 已提交
4027 4028
The runtime provides code to manage inter-thread communication. This includes
the system of thread-lifecycle state transitions depending on the contents of
S
Steve Klabnik 已提交
4029 4030 4031 4032 4033 4034 4035 4036 4037
queues, as well as code to copy values between queues and their recipients and
to serialize values for transmission over operating-system inter-process
communication facilities.

### Linkage

The Rust compiler supports various methods to link crates together both
statically and dynamically. This section will explore the various methods to
link Rust crates together, and more information about native libraries can be
S
Steve Klabnik 已提交
4038
found in the [ffi section of the book][ffi].
S
Steve Klabnik 已提交
4039 4040 4041 4042 4043 4044 4045

In one session of compilation, the compiler can generate multiple artifacts
through the usage of either command line flags or the `crate_type` attribute.
If one or more command line flag is specified, all `crate_type` attributes will
be ignored in favor of only building the artifacts specified by command line.

* `--crate-type=bin`, `#[crate_type = "bin"]` - A runnable executable will be
S
Steve Klabnik 已提交
4046
  produced. This requires that there is a `main` function in the crate which
S
Steve Klabnik 已提交
4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061
  will be run when the program begins executing. This will link in all Rust and
  native dependencies, producing a distributable binary.

* `--crate-type=lib`, `#[crate_type = "lib"]` - A Rust library will be produced.
  This is an ambiguous concept as to what exactly is produced because a library
  can manifest itself in several forms. The purpose of this generic `lib` option
  is to generate the "compiler recommended" style of library. The output library
  will always be usable by rustc, but the actual type of library may change from
  time-to-time. The remaining output types are all different flavors of
  libraries, and the `lib` type can be seen as an alias for one of them (but the
  actual one is compiler-defined).

* `--crate-type=dylib`, `#[crate_type = "dylib"]` - A dynamic Rust library will
  be produced. This is different from the `lib` output type in that this forces
  dynamic library generation. The resulting dynamic library can be used as a
S
Steve Klabnik 已提交
4062
  dependency for other libraries and/or executables. This output type will
S
Steve Klabnik 已提交
4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076
  create `*.so` files on linux, `*.dylib` files on osx, and `*.dll` files on
  windows.

* `--crate-type=staticlib`, `#[crate_type = "staticlib"]` - A static system
  library will be produced. This is different from other library outputs in that
  the Rust compiler will never attempt to link to `staticlib` outputs. The
  purpose of this output type is to create a static library containing all of
  the local crate's code along with all upstream dependencies. The static
  library is actually a `*.a` archive on linux and osx and a `*.lib` file on
  windows. This format is recommended for use in situations such as linking
  Rust code into an existing non-Rust application because it will not have
  dynamic dependencies on other Rust code.

* `--crate-type=rlib`, `#[crate_type = "rlib"]` - A "Rust library" file will be
S
Steve Klabnik 已提交
4077
  produced. This is used as an intermediate artifact and can be thought of as a
S
Steve Klabnik 已提交
4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146
  "static Rust library". These `rlib` files, unlike `staticlib` files, are
  interpreted by the Rust compiler in future linkage. This essentially means
  that `rustc` will look for metadata in `rlib` files like it looks for metadata
  in dynamic libraries. This form of output is used to produce statically linked
  executables as well as `staticlib` outputs.

Note that these outputs are stackable in the sense that if multiple are
specified, then the compiler will produce each form of output at once without
having to recompile. However, this only applies for outputs specified by the
same method. If only `crate_type` attributes are specified, then they will all
be built, but if one or more `--crate-type` command line flag is specified,
then only those outputs will be built.

With all these different kinds of outputs, if crate A depends on crate B, then
the compiler could find B in various different forms throughout the system. The
only forms looked for by the compiler, however, are the `rlib` format and the
dynamic library format. With these two options for a dependent library, the
compiler must at some point make a choice between these two formats. With this
in mind, the compiler follows these rules when determining what format of
dependencies will be used:

1. If a static library is being produced, all upstream dependencies are
   required to be available in `rlib` formats. This requirement stems from the
   reason that a dynamic library cannot be converted into a static format.

   Note that it is impossible to link in native dynamic dependencies to a static
   library, and in this case warnings will be printed about all unlinked native
   dynamic dependencies.

2. If an `rlib` file is being produced, then there are no restrictions on what
   format the upstream dependencies are available in. It is simply required that
   all upstream dependencies be available for reading metadata from.

   The reason for this is that `rlib` files do not contain any of their upstream
   dependencies. It wouldn't be very efficient for all `rlib` files to contain a
   copy of `libstd.rlib`!

3. If an executable is being produced and the `-C prefer-dynamic` flag is not
   specified, then dependencies are first attempted to be found in the `rlib`
   format. If some dependencies are not available in an rlib format, then
   dynamic linking is attempted (see below).

4. If a dynamic library or an executable that is being dynamically linked is
   being produced, then the compiler will attempt to reconcile the available
   dependencies in either the rlib or dylib format to create a final product.

   A major goal of the compiler is to ensure that a library never appears more
   than once in any artifact. For example, if dynamic libraries B and C were
   each statically linked to library A, then a crate could not link to B and C
   together because there would be two copies of A. The compiler allows mixing
   the rlib and dylib formats, but this restriction must be satisfied.

   The compiler currently implements no method of hinting what format a library
   should be linked with. When dynamically linking, the compiler will attempt to
   maximize dynamic dependencies while still allowing some dependencies to be
   linked in via an rlib.

   For most situations, having all libraries available as a dylib is recommended
   if dynamically linking. For other situations, the compiler will emit a
   warning if it is unable to determine which formats to link each library with.

In general, `--crate-type=bin` or `--crate-type=lib` should be sufficient for
all compilation needs, and the other options are just available if more
fine-grained control is desired over the output format of a Rust crate.

# Appendix: Rationales and design tradeoffs

*TODO*.

B
Brendan Zabarauskas 已提交
4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168
# Appendix: Influences

Rust is not a particularly original language, with design elements coming from
a wide range of sources. Some of these are listed below (including elements
that have since been removed):

* SML, OCaml: algebraic datatypes, pattern matching, type inference,
  semicolon statement separation
* C++: references, RAII, smart pointers, move semantics, monomorphisation,
  memory model
* ML Kit, Cyclone: region based memory management
* Haskell (GHC): typeclasses, type families
* Newsqueak, Alef, Limbo: channels, concurrency
* Erlang: message passing, task failure, ~~linked task failure~~,
  ~~lightweight concurrency~~
* Swift: optional bindings
* Scheme: hygienic macros
* C#: attributes
* Ruby: ~~block syntax~~
* NIL, Hermes: ~~typestate~~
* [Unicode Annex #31](http://www.unicode.org/reports/tr31/): identifier and
  pattern syntax
S
Steve Klabnik 已提交
4169

S
Steve Klabnik 已提交
4170
[ffi]: book/ffi.html
Y
York Xiang 已提交
4171
[plugin]: book/plugins.html