@@ -3511,13 +3511,21 @@ more of the closure traits:
3511
3511
3512
3512
### Trait objects
3513
3513
3514
- Every trait item (see [ traits] ( #traits ) ) defines a type with the same name as
3515
- the trait. This type is called the _ trait object_ of the trait. Trait objects
3516
- permit "late binding" of methods, dispatched using _ virtual method tables_
3517
- ("vtables"). Whereas most calls to trait methods are "early bound" (statically
3518
- resolved) to specific implementations at compile time, a call to a method on an
3519
- trait objects is only resolved to a vtable entry at compile time. The actual
3520
- implementation for each vtable entry can vary on an object-by-object basis.
3514
+ In Rust, a type like ` &SomeTrait ` or ` Box<SomeTrait> ` is called a _ trait object_ .
3515
+ Each instance of a trait object includes:
3516
+
3517
+ - a pointer to an instance of a type ` T ` that implements ` SomeTrait `
3518
+ - a _ virtual method table_ , often just called a _ vtable_ , which contains, for
3519
+ each method of ` SomeTrait ` that ` T ` implements, a pointer to ` T ` 's
3520
+ implementation (i.e. a function pointer).
3521
+
3522
+ The purpose of trait objects is to permit "late binding" of methods. A call to
3523
+ a method on a trait object is only resolved to a vtable entry at compile time.
3524
+ The actual implementation for each vtable entry can vary on an object-by-object
3525
+ basis.
3526
+
3527
+ Note that for a trait object to be instantiated, the trait must be
3528
+ _ object-safe_ . Object safety rules are defined in [ RFC 255] [ rfc255 ] .
3521
3529
3522
3530
Given a pointer-typed expression ` E ` of type ` &T ` or ` Box<T> ` , where ` T `
3523
3531
implements trait ` R ` , casting ` E ` to the corresponding pointer type ` &R ` or
0 commit comments