|0.2.0||Oct 12, 2022|
|0.2.0-dev.1||Aug 12, 2021|
|0.1.1||Jan 8, 2021|
|0.1.0||Oct 19, 2020|
#317 in Rust patterns
35,940 downloads per month
Used in 131 crates (9 directly)
Provides a workaround for absence of
non_static_type_id feature in Rust
and extended version of
Any trait for types with single lifetime.
For more details see documentation.
LicenseLicensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this repository by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Rust RFC for
non_static_type_id feature has been reverted.
Which means in foreseeable future there will be no built-in way in rust to get type id for non-static type
let alone safely use it to downcast to a particular type.
This crate provides tools to do these things safely for types with single lifetime. Although looks like it is technically possible to extend this approach for multiple lifetimes, consistent api and derive macro would be much harder to create and use because of the necessity to properly handle lifetime relations. Feel free to create an issue if you have actual use case where you need this functionality for multiple lifetimes.
Also it has better downcasting that allows you do downcast not just from
dyn Tid (like
dyn Any) but from
any trait object that implements [
So there is no more need to extend your traits with
fn to_any(&self)-> &dyn Any
1.41.0-stable (without nightly feature)
Basically in places where before you have used
dyn Any you can use
- If your type is generic you should derive
Tidimplementation for it with
Tidderive macro. Then to retrieve back concrete type
<dyn Tid>::downcast_*methods should be used.
- If your type is not generic/implements Any you can create
dyn Tidfrom it via any of the available
Fromimplementations. Then to retrieve back concrete type
<dyn Tid>::downcast_any_*methods should be used
- If your type is not generic and local to your crate you also can derive
Tidbut then you need to be careful to use methods that corresponds to the way you create
dyn Tidfor that particular type. Otherwise downcasting will return
If all your types can implement
Tid to avoid confusion
recommended way is to use first option even if some types implement
If there are some types that implement
Any and can't implement
Tid (i.e. types from other library),
recommended way is to use second option for all types that implement
Any to reduce confusion to minimum.
Interoperability with Any
Unfortunately you can't just use
Tid everywhere because currently it is impossible
T:Any since it would conflict with any other possible
To overcome this limitation there is a
From impl to go from
Box/&/&mut T where T:Any to
Box/&/&mut dyn Tid.
Nevertheless if you are using
dyn Trait where
Trait:Tid all of this wouldn't work,
and you are left with
It is safe because created trait object preserves lifetime information,
thus allowing us to safely downcast with proper lifetime.
Otherwise internally it is plain old