@@ -93,8 +93,8 @@ Tuple types and values are denoted by listing the types or values of their
9393elements, respectively, in a parenthesized, comma-separated list.
9494
9595Because tuple elements don't have a name, they can only be accessed by
96- pattern-matching or by using ` N ` directly as a field to access the
97- ` N ` th element.
96+ pattern-matching or by using ` N ` directly as a field to access the ` N ` th
97+ element.
9898
9999An example of a tuple type and its use:
100100
@@ -162,13 +162,13 @@ expression](expressions.html#struct-expressions).
162162
163163The memory layout of a ` struct ` is undefined by default to allow for compiler
164164optimizations like field reordering, but it can be fixed with the
165- ` #[repr(...)] ` attribute. In either case, fields may be given in any order in
166- a corresponding struct * expression* ; the resulting ` struct ` value will always
165+ ` #[repr(...)] ` attribute. In either case, fields may be given in any order in a
166+ corresponding struct * expression* ; the resulting ` struct ` value will always
167167have the same memory layout.
168168
169169The fields of a ` struct ` may be qualified by [ visibility
170- modifiers] ( visibility-and-privacy.html ) , to allow access to data in a
171- struct outside a module.
170+ modifiers] ( visibility-and-privacy.html ) , to allow access to data in a struct
171+ outside a module.
172172
173173A _ tuple struct_ type is just like a struct type, except that the fields are
174174anonymous.
@@ -178,9 +178,6 @@ The one value constructed by the associated [struct
178178expression] ( expressions.html#struct-expressions ) is the only value that
179179inhabits such a type.
180180
181- [ ^ structtype ] : ` struct ` types are analogous to ` struct ` types in C, the
182- * record* types of the ML family, or the * struct* types of the Lisp family.
183-
184181[ ^ structtype ] : ` struct ` types are analogous to ` struct ` types in C, the
185182 * record* types of the ML family, or the * struct* types of the Lisp family.
186183
@@ -202,6 +199,21 @@ corresponding `enum` type, as well as the size needed to store a discriminant.
202199Enum types cannot be denoted * structurally* as types, but must be denoted by
203200named reference to an [ ` enum ` item] ( items.html#enumerations ) .
204201
202+ [ ^ enumtype ] : The ` enum ` type is analogous to a ` data ` constructor declaration in
203+ ML, or a * pick ADT* in Limbo.
204+
205+ ## Union types
206+
207+ A * union type* is a nominal, heterogeneous C-like union, denoted by the name of
208+ a [ ` union ` item] ( items.html#unions ) .
209+
210+ A union contains the value of any one of its fields. Since the accessing the
211+ wrong field can cause unexpected or undefined behaviour, it requires ` unsafe ` ,
212+ except for initializing a union and writing ` Copy ` fields.
213+
214+ The memory layout of a ` union ` is undefined by default, but the ` #[repr(...)] `
215+ attribute can be used to fix a layout.
216+
205217[ ^ enumtype ] : The ` enum ` type is analogous to a ` data ` constructor declaration in
206218 ML, or a * pick ADT* in Limbo.
207219
@@ -252,6 +264,12 @@ operation: it involves only copying the pointer itself, that is, pointers are
252264referencing of a [ temporary value] ( expressions.html#temporary-lifetimes ) will
253265keep it alive during the scope of the reference itself.
254266
267+ ### Mutable references (` &mut ` )
268+
269+ These also point to memory owned by some other value. A mutable reference type
270+ is written ` &mut type ` or ` &'a mut type ` . A mutable reference (that hasn't been
271+ borrowed) is the only way to access the value it points to, so is not ` Copy ` .
272+
255273### Raw pointers (` *const ` and ` *mut ` )
256274
257275Raw pointers are pointers without safety or liveness guarantees. Raw pointers
@@ -368,9 +386,9 @@ more of the closure traits:
368386 moved in the body of the closure. ` Fn ` inherits from ` FnMut ` , which itself
369387 inherits from ` FnOnce ` .
370388
371- Closures that don't use anything from their environment ("non capturing closures")
372- can be coerced to function pointers (` fn ` ) with the matching signature.
373- To adopt the example from the section above:
389+ Closures that don't use anything from their environment ("non capturing
390+ closures") can be coerced to function pointers (` fn ` ) with the matching
391+ signature. To adopt the example from the section above:
374392
375393``` rust
376394let add = | x , y | x + y ;
@@ -490,6 +508,50 @@ objects of type `Ref<'a, SomeTrait>` are the same as `Ref<'a, (SomeTrait +
490508example in ` std::rc::Rc<T> ` .
491509
492510
511+ ## Dynamically sized types
512+
513+ Most types have a fixed size that is known at compile time and implement the
514+ trait [ ` Sized ` ] . A type with a size that is known only at run-time is called a
515+ _ dynamically sized type_ (_ DST_ ) or unsized type. [ Slices] and [ trait objects]
516+ are two of the most DSTs. Such types can only be used in certain cases:
517+
518+ * [ Pointer types] to DSTs are sized but have twice the size of pointers to
519+ sized types
520+ * Pointers to slices also store the number of elements of the slice.
521+ * Pointers to trait objects also store a pointer to a vtable.
522+ * Traits may be implemented for DSTs, this means that ` Self ` is not assumed to
523+ implement ` Sized ` in trait definitions by default.
524+ * DSTs can be used as type parameters with a bound of ` ?Sized `
525+ * Structs may contain a DST as the last field, this makes the struct a DST as
526+ well.
527+
528+ Notably: [ variables] , function parameters, [ const] and [ static] items must be
529+ sized.
530+
531+ [ `Sized` ] : the-sized-trait.html
532+ [ Slices ] : #array-and-slice-types
533+ [ trait objects ] : #trait-objects
534+ [ Pointer types ] : #pointer-types
535+ [ variables ] : variables.html
536+ [ const ] : items.html#constant-items
537+ [ static ] : items.html#static-items
538+
539+ ## Interior mutability
540+
541+ References prevent a value being both aliased and mutated: mutable references
542+ don't allow a value to be aliased and shared references prevent a value from
543+ being mutated. Sometimes this is too restrictive. The type
544+ [ ` std::cell::UnsafeCell<T> ` ] ( ../std/cell/struct.UnsafeCell.html ) provides an
545+ unsafe API that allows a type to own a ` T ` that can be mutated through a shared
546+ reference to the ` UnsafeCell ` (there is no change to mutable references).
547+
548+ The standard library provides a variety of different types that safely wrap
549+ this functionality. For example ` std::cell::RefCell<T> ` uses run-time borrow
550+ checks to ensure the usual rules around multiple references. The
551+ ` std::sync::atomic ` module contains types that wrap a value that is only
552+ accessed with atomic operations, allowing the value to be shared and mutated
553+ across threads.
554+
493555## Type parameters
494556
495557Within the body of an item that has type parameter declarations, the names of
0 commit comments