Skip to content

Commit a3e8f41

Browse files
committed
doc: Document constants in the reference
1 parent d03a4b0 commit a3e8f41

File tree

1 file changed

+65
-19
lines changed

1 file changed

+65
-19
lines changed

src/doc/reference.md

+65-19
Original file line numberDiff line numberDiff line change
@@ -1383,44 +1383,87 @@ a = Cat { name: "Spotty".to_string(), weight: 2.7 };
13831383
In this example, `Cat` is a _struct-like enum variant_,
13841384
whereas `Dog` is simply called an enum variant.
13851385

1386-
### Static items
1386+
### Constant items
13871387

13881388
```{.ebnf .gram}
1389-
static_item : "static" ident ':' type '=' expr ';' ;
1389+
const_item : "const" ident ':' type '=' expr ';' ;
13901390
```
13911391

1392-
A *static item* is a named _constant value_ stored in the global data section
1393-
of a crate. Immutable static items are stored in the read-only data section.
1394-
The constant value bound to a static item is, like all constant values,
1395-
evaluated at compile time. Static items have the `static` lifetime, which
1396-
outlives all other lifetimes in a Rust program. Only values stored in the
1397-
global data section (such as string constants and static items) can have the
1398-
`static` lifetime; dynamically constructed values cannot safely be assigned the
1399-
`static` lifetime. Static items are declared with the `static` keyword. A
1400-
static item must have a _constant expression_ giving its definition.
1392+
A *constant item* is a named _constant value_ which is not associated with a
1393+
specific memory location in the program. Constants are essentially inlined
1394+
wherever they are used, meaning that they are copied directly into the relevant
1395+
context when used. References to the same constant are not necessarily
1396+
guaranteed to refer to the same memory address.
1397+
1398+
Constant values must not have destructors, and otherwise permit most forms of
1399+
data. Constants may refer to the address of other constants, in which case the
1400+
address will have the `static` lifetime. The compiler is, however, still at
1401+
liberty to translate the constant many times, so the address referred to may not
1402+
be stable.
14011403

1402-
Static items must be explicitly typed. The type may be `bool`, `char`,
1403-
a number, or a type derived from those primitive types. The derived types are
1404-
references with the `static` lifetime, fixed-size arrays, tuples, and structs.
1404+
Constants must be explicitly typed. The type may be `bool`, `char`, a number, or
1405+
a type derived from those primitive types. The derived types are references with
1406+
the `static` lifetime, fixed-size arrays, tuples, enum variants, and structs.
14051407

14061408
```
1407-
static BIT1: uint = 1 << 0;
1408-
static BIT2: uint = 1 << 1;
1409+
const BIT1: uint = 1 << 0;
1410+
const BIT2: uint = 1 << 1;
14091411
1410-
static BITS: [uint, ..2] = [BIT1, BIT2];
1411-
static STRING: &'static str = "bitstring";
1412+
const BITS: [uint, ..2] = [BIT1, BIT2];
1413+
const STRING: &'static str = "bitstring";
14121414
14131415
struct BitsNStrings<'a> {
14141416
mybits: [uint, ..2],
14151417
mystring: &'a str
14161418
}
14171419
1418-
static BITS_N_STRINGS: BitsNStrings<'static> = BitsNStrings {
1420+
const BITS_N_STRINGS: BitsNStrings<'static> = BitsNStrings {
14191421
mybits: BITS,
14201422
mystring: STRING
14211423
};
14221424
```
14231425

1426+
### Static items
1427+
1428+
```{.ebnf .gram}
1429+
static_item : "static" ident ':' type '=' expr ';' ;
1430+
```
1431+
1432+
A *static item* is similar to a *constant*, except that it represents a precise
1433+
memory location in the program. A static is never "inlined" at the usage site,
1434+
and all references to it refer to the same memory location. Static items have
1435+
the `static` lifetime, which outlives all other lifetimes in a Rust program.
1436+
Static items may be placed in read-only memory if they do not contain any
1437+
interior mutability.
1438+
1439+
Statics may contain interior mutability through the `UnsafeCell` language item.
1440+
All access to a static is safe, but there are a number of restrictions on
1441+
statics:
1442+
1443+
* Statics may not contain any destructors.
1444+
* The types of static values must ascribe to `Sync` to allow threadsafe access.
1445+
* Statics may not refer to other statics by value, only by reference.
1446+
* Constants cannot refer to statics.
1447+
1448+
Constants should in general be preferred over statics, unless large amounts of
1449+
data are being stored, or single-address and mutability properties are required.
1450+
1451+
```
1452+
use std::sync::atomic;
1453+
1454+
// Note that INIT_ATOMIC_UINT is a *const*, but it may be used to initialize a
1455+
// static. This static can be modified, so it is not placed in read-only memory.
1456+
static COUNTER: atomic::AtomicUint = atomic::INIT_ATOMIC_UINT;
1457+
1458+
// This table is a candidate to be placed in read-only memory.
1459+
static TABLE: &'static [uint] = &[1, 2, 3, /* ... */];
1460+
1461+
for slot in TABLE.iter() {
1462+
println!("{}", slot);
1463+
}
1464+
COUNTER.fetch_add(1, atomic::SeqCst);
1465+
```
1466+
14241467
#### Mutable statics
14251468

14261469
If a static item is declared with the `mut` keyword, then it is allowed to
@@ -1455,6 +1498,9 @@ unsafe fn bump_levels_unsafe2() -> uint {
14551498
}
14561499
```
14571500

1501+
Mutable statics have the same restrictions as normal statics, except that the
1502+
type of the value is not required to ascribe to `Sync`.
1503+
14581504
### Traits
14591505

14601506
A _trait_ describes a set of method types.

0 commit comments

Comments
 (0)