Вы не можете.
У вас в основном есть это:
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>();
Не ясно, что это то, что вам нужно.
Если вы этого не сделаете , тогда вам нужно сделать Foo
generi c over T
:
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
}
}