gpt4 book ai didi

generics - 如何在结构本身不需要通用参数的通用impl block 中添加类型注释?

转载 作者:行者123 更新时间:2023-12-03 11:43:17 24 4
gpt4 key购买 nike

我一直试图帮助编译器推断通用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>();
...
}
}

当使用Foo时,编译器通常可以推断 T的类型,但是在调用 let var = Foo::new()的某个地方,我得到此错误:
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

如何注释通用类型?正确的语法是什么?

最佳答案

你不能

您基本上有这个:

struct Foo;

impl<T> Foo {
}

什么导致

error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or predicates
--> src/lib.rs:3:6
|
3 | impl<T> Foo {
| ^ unconstrained type parameter

因为泛型本身对实现项没有任何意义。它们仅对类型或方法有意义。

基本上,你想要

pub struct Foo {
size: usize,
}

impl Foo {
pub fn new<T>() -> Self {
let size = std::mem::size_of::<T>();
Self {
size
}
}

pub fn update<T>(self, data: &T) -> Self {
self
}
}

例如,可以将其称为 Foo::new::<String>()。但是,用户可以使用另一种类型来更新为 Foo创建的 String:

let foo = Foo::new::<String>();
foo.update::<u32>();

尚不清楚这是您想要的。

如果不这样做,则需要使 FooT通用:

use core::marker::PhantomData;

pub struct Foo<T> {
size: usize,
_dummy: PhantomData<T>,
}

impl<T> Foo<T> {
pub fn new() -> Self {
let size = std::mem::size_of::<T>();
Self {
size,
_dummy: PhantomData
}
}

pub fn update(self, data: &T) -> Self {
self
}
}

关于generics - 如何在结构本身不需要通用参数的通用impl block 中添加类型注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61287641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com