Generics Rust:有没有办法知道arg是某种泛型类型,而不关心其内部类型?
我知道我可以使用Generics Rust:有没有办法知道arg是某种泛型类型,而不关心其内部类型?,generics,rust,Generics,Rust,我知道我可以使用TypeId来确定arg是否属于某种特定类型: use std::any::{Any, TypeId}; fn is_string<T: ?Sized + Any>(_s: &T) -> bool { TypeId::of::<String>() == TypeId::of::<T>() } 使用std::any:{any,TypeId}; fn是字符串(&T)->bool{ TypeId::of::()==TypeI
TypeId
来确定arg是否属于某种特定类型:
use std::any::{Any, TypeId};
fn is_string<T: ?Sized + Any>(_s: &T) -> bool {
TypeId::of::<String>() == TypeId::of::<T>()
}
使用std::any:{any,TypeId};
fn是字符串(&T)->bool{
TypeId::of::()==TypeId::of::()
}
但是,有没有一种方法可以知道arg是某种泛型类型,而不考虑内部类型
use std::any::{Any, TypeId};
fn is_vec<T: ?Sized + Any>(_s: &T) -> bool {
TypeId::of::<Vec<_>>() == TypeId::of::<T>() // This fails with error[E0282]: type annotations needed
}
例如,我能在不考虑内部类型的情况下找出arg是否是Vec吗
use std::any::{Any, TypeId};
fn is_vec<T: ?Sized + Any>(_s: &T) -> bool {
TypeId::of::<Vec<_>>() == TypeId::of::<T>() // This fails with error[E0282]: type annotations needed
}
使用std::any:{any,TypeId};
fn是_-vec(_-s:&T)->bool{
TypeId::of::()==TypeId::of::()//此操作失败,错误为[E0282]:需要类型批注
}
我想知道这在锈蚀中是否有可能,不仅仅是使用TypeId。现在,我想在稳定锈蚀中没有办法做到这一点 然而,正如你所要求的那样,在夜间锈病上使用专业化:
#![feature(specialization)]
trait TIsVector {
fn is_vector(&self) -> bool;
}
impl<T> TIsVector for T {
default fn is_vector(&self) -> bool {
false
}
}
impl<T> TIsVector for Vec<T> {
default fn is_vector(&self) -> bool {
true
}
}
fn main() {
dbg!(1usize.is_vector());
dbg!(true.is_vector());
dbg!("sdf".is_vector());
dbg!(vec![1,2,3].is_vector());
}
#![专题(专门化)]
特征向量{
fn是_向量(&self)->bool;
}
T的impl向量{
默认fn为_向量(&self)->bool{
假的
}
}
Vec的impl向量{
默认fn为_向量(&self)->bool{
真的
}
}
fn main(){
dbg!(1usize.is_vector());
dbg!(true.is_vector());
dbg!(“sdf.is_vector());
dbg!(vec![1,2,3]。is_vector();
}
在稳定锈病中有一种通用的方法可以做到这一点,尽管它不允许您检查任何dyn
是否是Vec
。相反,我所做的是为Vec
和dynany
创建一个超级特性any。代码:
trait MyAny:Any{
fn获取容器(&self)->容器;
}
Vec的impl MyAny{
fn获取容器(&self)->容器{
矢量
}
}
为dyn Any植入MyAny{
fn获取容器(&self)->容器{
任何
}
}
容器是定义为的枚举
#[derive(Clone,Copy,PartialEq,Eq)]
#[non_exhaustive]
enum Container{
Vector,
Any,
}
因此,定义is_vec
函数很容易:
fn是向量(s:&T)->bool{
s、 获取容器()==向量
}
谢谢!这比解析谢谢之类的东西要好得多。然而,我接受了可以与稳定通道一起工作的答案。