#[repr(C)]
pub struct TraitObject {
pub data: *mut (),
pub vtable: *mut (),
}
🔬 This is a nightly-only experimental API. (
raw
#27751)
The representation of a trait object like &SomeTrait
.
This struct has the same layout as types like &SomeTrait
and
Box<AnotherTrait>
. The Trait Objects chapter of the
Book contains more details about the precise nature of
these internals.
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);Run
🔬 This is a nightly-only experimental API. (
raw
#27751)
🔬 This is a nightly-only experimental API. (
raw
#27751)
Performs copy-assignment from source
. Read more
🔬 This is a nightly-only experimental API. (
try_from
#33417)
The type returned in the event of a conversion error.
🔬 This is a nightly-only experimental API. (
try_from
#33417)
🔬 This is a nightly-only experimental API. (
try_from
#33417)
The type returned in the event of a conversion error.
🔬 This is a nightly-only experimental API. (
try_from
#33417)
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more
🔬 This is a nightly-only experimental API. (get_type_id
#27745)
this method will likely be replaced by an associated static
type Owned = T
Creates owned data from borrowed data, usually by cloning. Read more
🔬 This is a nightly-only experimental API. (toowned_clone_into
#41263)
recently added
Uses borrowed data to replace owned data, usually by cloning. Read more