我尝试使用一个静态方法的集合作为结构中的泛型,以便通过改变我的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
}
型
1条答案
按热度按时间l7mqbcuq1#
正如编译器告诉你的,你可以使用
PhantomData
标记来实现这个目的,这是一个非常好的方法。字符串
引用the documentation:
零号字体用来标记那些“表现得像”拥有T的东西。
在类型中添加
PhantomData<T>
字段会告诉编译器,您的类型的行为就像它存储了T
类型的值,即使它实际上没有。当计算某些安全属性时,会使用此信息。有关如何使用
PhantomData<T>
的更深入解释,请参阅the Nomicon。