@@ -2748,40 +2748,45 @@ call to the method `to_str`.
2748
2748
2749
2749
## Type kinds
2750
2750
2751
- Types in Rust are categorized into three kinds, based on whether they
2752
- allow copying of their values, and sending to different tasks. The
2753
- kinds are:
2754
-
2755
- Sendable
2756
- : Values with a sendable type can be safely sent to another task.
2751
+ Types in Rust are categorized into kinds, based on various properties of the components of the type.
2752
+ The kinds are:
2753
+
2754
+ ` Const `
2755
+ : Types of this kind are deeply immutable;
2756
+ they contain no mutable memory locations directly or indirectly via pointers.
2757
+ ` Send `
2758
+ : Types of this kind can be safely sent between tasks.
2757
2759
This kind includes scalars, owning pointers, owned closures, and
2758
2760
structural types containing only other sendable types.
2759
- Copyable
2761
+ ` Owned `
2762
+ : Types of this kind do not contain any borrowed pointers;
2763
+ this can be a useful guarantee for code that breaks borrowing assumptions using [ ` unsafe ` operations] ( #unsafe-functions ) .
2764
+ ` Copy `
2760
2765
: This kind includes all types that can be copied. All types with
2761
2766
sendable kind are copyable, as are managed boxes, managed closures,
2762
2767
trait types, and structural types built out of these.
2763
- Noncopyable
2764
- : [ Resource ] ( #resources ) types, and every type that includes a
2765
- resource without storing it in a managed box, may not be copied.
2766
- Types of sendable or copyable type can always be used in places
2767
- where a noncopyable type is expected, so in effect this kind
2768
- includes all types .
2769
-
2770
- These form a hierarchy. The noncopyable kind is the widest, including
2771
- all types in the language. The copyable kind is a subset of that, and
2772
- the sendable kind is a subset of the copyable kind.
2773
-
2774
- Any operation that causes a value to be copied requires the type of
2775
- that value to be of copyable kind. Type parameter types are assumed to
2776
- be noncopyable, unless one of the special bounds ` send ` or ` copy ` is
2777
- declared for it. For example, this is not a valid program:
2768
+ _ Default _
2769
+ : Types with destructors, closure environments,
2770
+ and various other _ non-first-class _ types,
2771
+ are not copyable at all.
2772
+ Such types can usually only be accessed through pointers,
2773
+ or in some cases, moved between mutable locations .
2774
+
2775
+ Kinds can be supplied as _ bounds _ on type parameters, like traits,
2776
+ in which case the parameter is constrained to types satisfying that kind.
2777
+
2778
+ By default, type parameters do not carry any assumed kind-bounds at all.
2779
+
2780
+ Any operation that causes a value to be copied requires the type of that value to be of copyable kind,
2781
+ so the ` Copy ` bound is frequently required on function type parameters.
2782
+ For example, this is not a valid program:
2778
2783
2779
2784
~~~~ {.xfail-test}
2780
2785
fn box<T>(x: T) -> @T { @x }
2781
2786
~~~~
2782
2787
2783
- Putting ` x ` into a managed box involves copying, and the ` T ` parameter
2784
- is assumed to be noncopyable. To change that, a bound is declared:
2788
+ Putting ` x ` into a managed box involves copying, and the ` T ` parameter has the default (non-copyable) kind.
2789
+ To change that, a bound is declared:
2785
2790
2786
2791
~~~~
2787
2792
fn box<T: Copy>(x: T) -> @T { @x }
0 commit comments