#[repr(C)]pub struct TraitObject {
pub data: *mut (),
pub vtable: *mut (),
}
The representation of a trait object like &dyn SomeTrait.
This struct has the same layout as types like &dyn SomeTrait and Box<dyn AnotherTrait>.
TraitObject is guaranteed to match layouts, but it is not the type of trait objects (e.g., the fields are not directly accessible on a &dyn SomeTrait) nor does it control that layout (changing the definition will not change the layout of a &dyn SomeTrait). It is only designed to be used by unsafe code that needs to manipulate the low-level details.
There is no way to refer to all trait objects generically, so the only way to create values of this type is with functions like std::mem::transmute. Similarly, the only way to create a true trait object from a TraitObject value is with transmute.
Synthesizing a trait object with mismatched types—one where the vtable does not correspond to the type of the value to which the data pointer points—is highly likely to lead to undefined behavior.
#![feature(raw)]
use std::{mem, raw};
// an example trait
trait Foo {
fn bar(&self) -> i32;
}
impl Foo for i32 {
fn bar(&self) -> i32 {
*self + 1
}
}
let value: i32 = 123;
// let the compiler make a trait object
let object: &dyn Foo = &value;
// look at the raw representation
let raw_object: raw::TraitObject = unsafe { mem::transmute(object) };
// the data pointer is the address of `value`
assert_eq!(raw_object.data as *const i32, &value as *const _);
let other_value: i32 = 456;
// construct a new object, pointing to a different `i32`, being
// careful to use the `i32` vtable from `object`
let synthesized: &dyn Foo = unsafe {
mem::transmute(raw::TraitObject {
data: &other_value as *const _ as *mut (),
vtable: raw_object.vtable,
})
};
// it should work just as if we had constructed a trait object out of
// `other_value` directly
assert_eq!(synthesized.bar(), 457);data: *mut ()vtable: *mut ()impl Clone for TraitObject[src]
fn clone(&self) -> TraitObject[src]
fn clone_from(&mut self, source: &Self)[src]1.0.0
impl Copy for TraitObject[src]
impl RefUnwindSafe for TraitObjectimpl !Send for TraitObjectimpl !Sync for TraitObjectimpl Unpin for TraitObjectimpl UnwindSafe for TraitObjectimpl<T> Any for T where
    T: 'static + ?Sized, [src]
impl<T> Borrow<T> for T where
    T: ?Sized, [src]
fn borrow(&self) -> &TⓘNotable traits for &'_ mut F
impl<'_, F> Future for &'_ mut F where
    F: Unpin + Future + ?Sized,Â
type Output = <F as Future>::Output;
impl<'_, I> Iterator for &'_ mut I where
    I: Iterator + ?Sized,Â
type Item = <I as Iterator>::Item;
impl<R:Â Read + ?Sized, '_> Read for &'_ mut R
impl<W:Â Write + ?Sized, '_> Write for &'_ mut W
[src]
impl<T> BorrowMut<T> for T where
    T: ?Sized, [src]
fn borrow_mut(&mut self) -> &mut TⓘNotable traits for &'_ mut F
impl<'_, F> Future for &'_ mut F where
    F: Unpin + Future + ?Sized,Â
type Output = <F as Future>::Output;
impl<'_, I> Iterator for &'_ mut I where
    I: Iterator + ?Sized,Â
type Item = <I as Iterator>::Item;
impl<R:Â Read + ?Sized, '_> Read for &'_ mut R
impl<W:Â Write + ?Sized, '_> Write for &'_ mut W
[src]
impl<T> From<T> for T[src]
impl<T, U> Into<U> for T where
    U: From<T>, [src]
impl<T> ToOwned for T where
    T: Clone, [src]
type Owned = TThe resulting type after obtaining ownership.
fn to_owned(&self) -> T[src]
fn clone_into(&self, target: &mut T)[src]
impl<T, U> TryFrom<U> for T where
    U: Into<T>, [src]
type Error = InfallibleThe type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]
impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, [src]
© 2010 The Rust Project Developers
Licensed under the Apache License, Version 2.0 or the MIT license, at your option.
https://doc.rust-lang.org/std/raw/struct.TraitObject.html