Generics 如何将类型注释添加到结构本身不存在的泛型impl块';不需要泛型参数吗?
我一直在努力帮助编译器推断泛型impl块的类型。代码如下:Generics 如何将类型注释添加到结构本身不存在的泛型impl块';不需要泛型参数吗?,generics,rust,Generics,Rust,我一直在努力帮助编译器推断泛型impl块的类型。代码如下: pub struct Foo { /*some non generic fields*/ } impl<T: AsBytes> Foo { pub fn new(/*some non generic params*/) -> Self { ... let size = std::mem::size_of::<T>(); ... }
pub struct Foo {
/*some non generic fields*/
}
impl<T: AsBytes> Foo {
pub fn new(/*some non generic params*/) -> Self {
...
let size = std::mem::size_of::<T>();
...
}
pub fn update(&self, data: &T) {
...
let data = data.as_bytes();
...
let size = std::mem::size_of::<T>();
...
}
}
如何注释泛型类型?这里的正确语法是什么?您不能
你基本上有:
structfoo;
impl-Foo{
}
导致
error[E0207]:类型参数'T'不受impl-trait、self-type或谓词的约束
-->src/lib.rs:3:6
|
3 | impl Foo{
|^无约束类型参数
因为泛型本身对实现项没有意义,它们只对类型或方法有意义
基本上,你想要
pub struct Foo{
大小:usize,
}
impl-Foo{
pub fn new()->Self{
设size=std::mem::size_of::();
自我{
大小
}
}
发布fn更新(self,数据:&T)->self{
自己
}
}
例如,可以将其称为Foo::new::()
。但是,用户可以使用另一种类型更新为字符串创建的Foo
:
let foo=foo::new::();
foo.update::();
不清楚这是否是你想要的
如果没有,则需要使Foo
通用于t
:
使用core::marker::PhantomData;
pub struct Foo{
大小:usize,
_虚拟:幻影数据,
}
impl-Foo{
pub fn new()->Self{
设size=std::mem::size_of::();
自我{
大小,
_虚拟:幻影数据
}
}
发布fn更新(self,数据:&T)->self{
自己
}
}
你不能
你基本上有:
structfoo;
impl-Foo{
}
导致
error[E0207]:类型参数'T'不受impl-trait、self-type或谓词的约束
-->src/lib.rs:3:6
|
3 | impl Foo{
|^无约束类型参数
因为泛型本身对实现项没有意义,它们只对类型或方法有意义
基本上,你想要
pub struct Foo{
大小:usize,
}
impl-Foo{
pub fn new()->Self{
设size=std::mem::size_of::();
自我{
大小
}
}
发布fn更新(self,数据:&T)->self{
自己
}
}
例如,可以将其称为Foo::new::()
。但是,用户可以使用另一种类型更新为字符串创建的Foo
:
let foo=foo::new::();
foo.update::();
不清楚这是否是你想要的
如果没有,则需要使Foo
通用于t
:
使用core::marker::PhantomData;
pub struct Foo{
大小:usize,
_虚拟:幻影数据,
}
impl-Foo{
pub fn new()->Self{
设size=std::mem::size_of::();
自我{
大小,
_虚拟:幻影数据
}
}
发布fn更新(self,数据:&T)->self{
自己
}
}
我想强制update
和new
最终使用相同的具体类型,如果update
和new
使用了它们自己的泛型类型参数,那么我想PhantomData选项最有意义。我没有看到您只给出了我发布的一个错误。您只会得到这个不幸的是,在您解决了所有其他错误之后出现了错误。我想强制update
和new
最终使用相同的具体类型,如果update
和new
使用了它们自己的泛型类型参数,那么我想PhantomData选项是最有意义的。我没有看到错误r您只提供了我发布的一个。只有在您解决了所有其他错误后,您才会收到此错误。
error[E0282]: type annotations needed
--> src/bar/foo.rs:98:13
|
98 | Foo::new(param1, param2);
| ^^^^^^^^^^^^^^^^^^^^^ cannot infer type for type parameter `T`
error: aborting due to previous error