Skip to content

Commit cc53248

Browse files
committed
---
yaml --- r: 233516 b: refs/heads/beta c: a1f64c2 h: refs/heads/master v: v3
1 parent 25c2a82 commit cc53248

File tree

3 files changed

+39
-4
lines changed

3 files changed

+39
-4
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ refs/tags/0.9: 36870b185fc5f5486636d4515f0e22677493f225
2323
refs/tags/0.10: ac33f2b15782272ae348dbd7b14b8257b2148b5a
2424
refs/tags/0.11.0: e1247cb1d0d681be034adb4b558b5a0c0d5720f9
2525
refs/tags/0.12.0: f0c419429ef30723ceaf6b42f9b5a2aeb5d2e2d1
26-
refs/heads/beta: 6f6ea4687e9d596d7136dc591dee312e51fa0ad7
26+
refs/heads/beta: a1f64c2204687263ca1230f08af1cc7317cc4a26
2727
refs/tags/1.0.0-alpha: e42bd6d93a1d3433c486200587f8f9e12590a4d7
2828
refs/heads/tmp: 370fe2786109360f7c35b8ba552b83b773dd71d6
2929
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f

branches/beta/src/doc/trpl/trait-objects.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,3 +300,41 @@ let y = TraitObject {
300300
// y.method();
301301
(y.vtable.method)(y.data);
302302
```
303+
304+
## Object Safety
305+
306+
Not every trait can be used to make a trait object. For example, vectors implement
307+
`Clone`, but if we try to make a trait object:
308+
309+
```ignore
310+
let v = vec![1, 2, 3];
311+
let o = &v as &Clone;
312+
```
313+
314+
We get an error:
315+
316+
```text
317+
error: cannot convert to a trait object because trait `core::clone::Clone` is not object-safe [E0038]
318+
let o = &v as &Clone;
319+
^~
320+
note: the trait cannot require that `Self : Sized`
321+
let o = &v as &Clone;
322+
^~
323+
```
324+
325+
The error says that `Clone` is not ‘object-safe’. Only traits that are
326+
object-safe can be made into trait objects. A trait is object-safe if both of
327+
these are true:
328+
329+
* the trait does not require that `Self: Sized`
330+
* all of its methods are object-safe
331+
332+
So what makes a method object-safe? Each method must require that `Self: Sized`
333+
or all of the following:
334+
335+
* must not have any type parameters
336+
* must not use `Self`
337+
338+
Whew! As we can see, almost all of these rules talk about `Self`. A good intuition
339+
is “except in special circumstances, if your trait’s method uses `Self`, it is not
340+
object-safe.”

branches/beta/src/libstd/io/mod.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,9 +1060,6 @@ pub trait Seek {
10601060
/// A seek beyond the end of a stream is allowed, but implementation
10611061
/// defined.
10621062
///
1063-
/// The behavior when seeking past the end of the stream is implementation
1064-
/// defined.
1065-
///
10661063
/// If the seek operation completed successfully,
10671064
/// this method returns the new position from the start of the stream.
10681065
/// That position can be used later with `SeekFrom::Start`.

0 commit comments

Comments
 (0)