Expand description
§Overview
Better As-any is a refined implementation of the
as-any crate. This crate avoids its
predecessor’s caveats that the API is error-prone when smart pointers are
involved and it’s impossible to downcasting an owned smart pointer.
With as-any crate, you can’t directly call is or downcast* methods on
a smart pointer, since it simply takes the smart pointer’s reference and
leads to a runtime error, which is hardly to be figure out.
§Usage
Make your traits inherit the InheritAny trait, and all necessary
functionalities will be added to your traits’ implementors, including trait
objects.
When downcasting is needed, corresponding helper traits including
DowncastRef, DowncastMut and Downcast are expected to be
imported.
use std::fmt::Debug;
use std::sync::Arc;
use better_as_any::{InheritAny, DowncastRef, Downcast};
pub trait Trait: InheritAny + Debug + Send + Sync {}
impl Trait for i32 {}
let val: Box<dyn Trait> = Box::new(42i32);
assert!(val.is::<i32>()); // No need to use `(*val).is::<i32>()`.
let val: Arc<dyn Trait> = Arc::from(val);
assert_eq!(*val.downcast_ref::<i32>().unwrap(), 42i32);
assert_eq!(val.downcast::<i32>().unwrap(), Arc::new(42i32)); // Downcasts the `Arc`.Re-exports§
pub use downcasting::Downcast;pub use downcasting::DowncastMut;pub use downcasting::DowncastRef;
Modules§
Traits§
- Inherit
Any - Trait which adds runtime reflection functionality to all its implementors