Skip to content

Commit 46061a8

Browse files
committed
---
yaml --- r: 210738 b: refs/heads/try c: 12c93aa h: refs/heads/master v: v3
1 parent da3ab9a commit 46061a8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+2383
-925
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
refs/heads/master: 3e561f05c00cd180ec02db4ccab2840a4aba93d2
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: ba0e1cd8147d452c356aacb29fb87568ca26f111
5-
refs/heads/try: 4b5b9668e0f13cb4cda51b06c098d4b34f86c1c5
5+
refs/heads/try: 12c93aa278ebbe8527b42d17065d3d5605c26bac
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
88
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596

branches/try/AUTHORS.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,7 @@ Rob Hoelz <[email protected]>
736736
Robert Buonpastore <[email protected]>
737737
Robert Clipsham <[email protected]>
738738
Robert Gawdzik <[email protected]>
739+
Robert Foss <[email protected]>
739740
Robert Irelan <[email protected]>
740741
Robert Knight <[email protected]>
741742
Robert Millar <[email protected]>

branches/try/src/doc/reference.md

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1346,6 +1346,8 @@ vtable when the trait is used as a [trait object](#trait-objects).
13461346
Traits are implemented for specific types through separate
13471347
[implementations](#implementations).
13481348

1349+
Consider the following trait:
1350+
13491351
```
13501352
# type Surface = i32;
13511353
# type BoundingBox = i32;
@@ -1360,6 +1362,20 @@ This defines a trait with two methods. All values that have
13601362
`draw` and `bounding_box` methods called, using `value.bounding_box()`
13611363
[syntax](#method-call-expressions).
13621364

1365+
Traits can include default implementations of methods, as in:
1366+
1367+
```
1368+
trait Foo {
1369+
fn bar(&self);
1370+
1371+
fn baz(&self) { println!("We called baz."); }
1372+
}
1373+
```
1374+
1375+
Here the `baz` method has a default implementation, so types that implement
1376+
`Foo` need only implement `bar`. It is also possible for implementing types
1377+
to override a method that has a default implementation.
1378+
13631379
Type parameters can be specified for a trait to make it generic. These appear
13641380
after the trait name, using the same syntax used in [generic
13651381
functions](#generic-functions).
@@ -1372,6 +1388,30 @@ trait Seq<T> {
13721388
}
13731389
```
13741390

1391+
It is also possible to define associated types for a trait. Consider the
1392+
following example of a `Container` trait. Notice how the type is available
1393+
for use in the method signatures:
1394+
1395+
```
1396+
trait Container {
1397+
type E;
1398+
fn empty() -> Self;
1399+
fn insert(&mut self, Self::E);
1400+
}
1401+
```
1402+
1403+
In order for a type to implement this trait, it must not only provide
1404+
implementations for every method, but it must specify the type `E`. Here's
1405+
an implementation of `Container` for the standard library type `Vec`:
1406+
1407+
```
1408+
impl<T> Container for Vec<T> {
1409+
type E = T;
1410+
fn empty() -> Vec<T> { Vec::new() }
1411+
fn insert(&mut self, x: T) { self.push(x); }
1412+
}
1413+
```
1414+
13751415
Generic functions may use traits as _bounds_ on their type parameters. This
13761416
will have two effects: only types that have the trait may instantiate the
13771417
parameter, and within the generic function, the methods of the trait can be
@@ -3470,13 +3510,21 @@ more of the closure traits:
34703510

34713511
### Trait objects
34723512

3473-
Every trait item (see [traits](#traits)) defines a type with the same name as
3474-
the trait. This type is called the _trait object_ of the trait. Trait objects
3475-
permit "late binding" of methods, dispatched using _virtual method tables_
3476-
("vtables"). Whereas most calls to trait methods are "early bound" (statically
3477-
resolved) to specific implementations at compile time, a call to a method on an
3478-
trait objects is only resolved to a vtable entry at compile time. The actual
3479-
implementation for each vtable entry can vary on an object-by-object basis.
3513+
In Rust, a type like `&SomeTrait` or `Box<SomeTrait>` is called a _trait object_.
3514+
Each instance of a trait object includes:
3515+
3516+
- a pointer to an instance of a type `T` that implements `SomeTrait`
3517+
- a _virtual method table_, often just called a _vtable_, which contains, for
3518+
each method of `SomeTrait` that `T` implements, a pointer to `T`'s
3519+
implementation (i.e. a function pointer).
3520+
3521+
The purpose of trait objects is to permit "late binding" of methods. A call to
3522+
a method on a trait object is only resolved to a vtable entry at compile time.
3523+
The actual implementation for each vtable entry can vary on an object-by-object
3524+
basis.
3525+
3526+
Note that for a trait object to be instantiated, the trait must be
3527+
_object-safe_. Object safety rules are defined in [RFC 255][rfc255].
34803528

34813529
Given a pointer-typed expression `E` of type `&T` or `Box<T>`, where `T`
34823530
implements trait `R`, casting `E` to the corresponding pointer type `&R` or

branches/try/src/liballoc/boxed.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ use core::ops::{Deref, DerefMut};
6262
use core::ptr::{Unique};
6363
use core::raw::{TraitObject};
6464

65+
#[cfg(not(stage0))]
66+
use core::marker::Unsize;
67+
#[cfg(not(stage0))]
68+
use core::ops::CoerceUnsized;
69+
6570
/// A value that represents the heap. This is the default place that the `box`
6671
/// keyword allocates into when no place is supplied.
6772
///
@@ -390,3 +395,6 @@ impl<'a,A,R> FnOnce<A> for Box<FnBox<A,Output=R>+Send+'a> {
390395
self.call_box(args)
391396
}
392397
}
398+
399+
#[cfg(not(stage0))]
400+
impl<T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<Box<U>> for Box<T> {}

0 commit comments

Comments
 (0)