Rust调用泛型类型参数的trait方法

时间:2013-12-03 03:39:39

标签: rust traits

假设我有一个生锈特征,其中包含一个不带& self参数的函数。有没有办法让我根据实现该特征的具体类型的泛型类型参数调用此函数?例如,在下面的get_type_id函数中,如何成功调用CustomType特征的type_id()函数?

pub trait TypeTrait {
    fn type_id() -> u16;
}

pub struct CustomType {
    // fields...
}

impl TypeTrait for CustomType {
    fn type_id() -> u16 { 0 }
}

pub fn get_type_id<T : TypeTrait>() {
    // how?
}

谢谢!

2 个答案:

答案 0 :(得分:7)

正如Aatch所说,这目前无法实现。解决方法是使用虚拟参数指定Self的类型:

pub trait TypeTrait {
    fn type_id(_: Option<Self>) -> u16;
}

pub struct CustomType {
    // fields...
}

impl TypeTrait for CustomType {
    fn type_id(_: Option<CustomType>) -> u16 { 0 }
}

pub fn get_type_id<T : TypeTrait>() {
    let type_id = TypeTrait::type_id(None::<T>);
}

答案 1 :(得分:4)

不幸的是,这目前无法实现。过去,它基于一个实现细节,然而被删除,有利于最终实现这样做的正确方法。

当它最终实现时,它可能最终看起来像这样:TypeTrait::<for T>::type_id(),但是目前没有语法设置。

这是一个众所周知的案例,而且完全打算得到支持,不幸的是,它目前是不可能的。

关于这个主题的完整讨论(称为相关方法)在这里:https://github.com/mozilla/rust/issues/6894和这里:https://github.com/mozilla/rust/issues/8888