Generics 如何将类型注释添加到结构本身不存在的泛型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>(); ... }

我一直在努力帮助编译器推断泛型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 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