rust 如何在泛型结构中定义静态方法集合

wljmcqd8  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(73)

我尝试使用一个静态方法的集合作为结构中的泛型,以便通过改变我的trait的实现来改变我的代码的一部分的行为。
我的问题是,我无法使用通用的,如果我不包括它在我的一个特点,尽管收集没有数据或方法说话。

fn main() {
    println!("Hello, world!");
}

pub trait MyTrait {
    fn foo();

    fn bar();
}

struct MyStaticCollection {}

impl MyTrait for MyStaticCollection {
    fn foo() {
        println!("foo")
    }

    fn bar() {
        println!("bar")
    }
}

struct MyStruct<T: MyTrait> {
    my_data: String
}

impl<T> MyStruct<T>
    where T: MyTrait
{
    fn my_fonction() {
        T::foo();
        T::bar();
    }
}

字符串
此实现返回以下错误代码:
参数T从不使用考虑删除T,在字段中引用它,或使用标记,如PhantomData
难道没有比在MyStruct中定义一个空字段来示例化一个空结构更优雅方法吗?
解决方法:

struct MyStruct<T: MyTrait> {
    my_data: String,
    __: T
}

l7mqbcuq

l7mqbcuq1#

正如编译器告诉你的,你可以使用PhantomData标记来实现这个目的,这是一个非常好的方法。

struct MyStruct<T: MyTrait> {
    my_data: String,
    phantom: PhantomData<T>
}

字符串
引用the documentation
零号字体用来标记那些“表现得像”拥有T的东西。
在类型中添加PhantomData<T>字段会告诉编译器,您的类型的行为就像它存储了T类型的值,即使它实际上没有。当计算某些安全属性时,会使用此信息。
有关如何使用PhantomData<T>的更深入解释,请参阅the Nomicon

相关问题