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、 获取容器()==向量
}

谢谢!这比解析谢谢之类的东西要好得多。然而,我接受了可以与稳定通道一起工作的答案。