diff options
| author | bors <bors@rust-lang.org> | 2015-08-18 16:28:13 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-08-18 16:28:13 +0000 |
| commit | dc9b74f38d2824d929660deabd5e78e39dcea2c5 (patch) | |
| tree | 2a0eacfb8aa78052d9f358ddf1a3b279f15420a8 /src | |
| parent | c6291e04cc620ce3824d8bccdb8a5bd923fcd741 (diff) | |
| parent | ce1bdc729338d723faf2de9410f890c5d00e5bf6 (diff) | |
Auto merge of #27536 - steveklabnik:doc_object_safety, r=alexcrichton
Fixes #26938
Diffstat (limited to 'src')
| -rw-r--r-- | src/doc/trpl/trait-objects.md | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/doc/trpl/trait-objects.md b/src/doc/trpl/trait-objects.md index f9dbc143c82..8127b0898c4 100644 --- a/src/doc/trpl/trait-objects.md +++ b/src/doc/trpl/trait-objects.md @@ -300,3 +300,41 @@ let y = TraitObject { // y.method(); (y.vtable.method)(y.data); ``` + +## Object Safety + +Not every trait can be used to make a trait object. For example, vectors implement +`Clone`, but if we try to make a trait object: + +```ignore +let v = vec![1, 2, 3]; +let o = &v as &Clone; +``` + +We get an error: + +```text +error: cannot convert to a trait object because trait `core::clone::Clone` is not object-safe [E0038] +let o = &v as &Clone; + ^~ +note: the trait cannot require that `Self : Sized` +let o = &v as &Clone; + ^~ +``` + +The error says that `Clone` is not ‘object-safe’. Only traits that are +object-safe can be made into trait objects. A trait is object-safe if both of +these are true: + +* the trait does not require that `Self: Sized` +* all of its methods are object-safe + +So what makes a method object-safe? Each method must require that `Self: Sized` +or all of the following: + +* must not have any type parameters +* must not use `Self` + +Whew! As we can see, almost all of these rules talk about `Self`. A good intuition +is “except in special circumstances, if your trait’s method uses `Self`, it is not +object-safe.” |
