Trait std::marker::Reflect
[−]
[src]
pub trait Reflect { }: Specialization makes parametricity impossible
Types that can be reflected over.
By "reflection" we mean use of the Any trait, or related
machinery such as TypeId.
Reflect is implemented for all types. Its purpose is to ensure
that when you write a generic function that will employ reflection,
that must be reflected (no pun intended) in the generic bounds of
that function.
#![feature(reflect_marker)] use std::marker::Reflect; use std::any::Any; fn foo<T: Reflect + 'static>(x: &T) { let any: &Any = x; if any.is::<u32>() { println!("u32"); } }Run
Without the bound T: Reflect, foo would not typecheck. (As
a matter of style, it would be preferable to write T: Any,
because T: Any implies T: Reflect and T: 'static, but we
use Reflect here for illustrative purposes.)
The Reflect bound serves to alert foo's caller to the
fact that foo may behave differently depending on whether
T is u32 or not. The ability for a caller to reason about what
a function may do based solely on what generic bounds are declared
is often called the "parametricity property". Despite the
use of Reflect, Rust lacks true parametricity because a generic
function can, at the very least, call mem::size_of
without employing any trait bounds whatsoever.