#[repr(C)]
pub struct TraitObject {
pub data: *mut (),
pub vtable: *mut (),
}
🔬 This is a nightly-only experimental API. (raw
)
The representation of a trait object like &SomeTrait
.
This struct has the same layout as types like &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 &SomeTrait
) nor does it control that layout (changing the
definition will not change the layout of a &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};
trait Foo {
fn bar(&self) -> i32;
}
impl Foo for i32 {
fn bar(&self) -> i32 {
*self + 1
}
}
let value: i32 = 123;
let object: &Foo = &value;
let raw_object: raw::TraitObject = unsafe { mem::transmute(object) };
assert_eq!(raw_object.data as *const i32, &value as *const _);
let other_value: i32 = 456;
let synthesized: &Foo = unsafe {
mem::transmute(raw::TraitObject {
data: &other_value as *const _ as *mut (),
vtable: raw_object.vtable,
})
};
assert_eq!(synthesized.bar(), 457);
🔬 This is a nightly-only experimental API. (raw
)
🔬 This is a nightly-only experimental API. (raw
)
Performs copy-assignment from source
. Read more
Creates owned data from borrowed data, usually by cloning. Read more
🔬 This is a nightly-only experimental API. (toowned_clone_into
)
recently added
Uses borrowed data to replace owned data, usually by cloning. Read more
🔬 This is a nightly-only experimental API. (try_from
)
The type returned in the event of a conversion error.
🔬 This is a nightly-only experimental API. (try_from
)
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more
type Error = <U as TryFrom<T>>::Error
🔬 This is a nightly-only experimental API. (try_from
)
The type returned in the event of a conversion error.
🔬 This is a nightly-only experimental API. (try_from
)
🔬 This is a nightly-only experimental API. (get_type_id
)
this method will likely be replaced by an associated static