Можно ли объявить связанный тип, который будет представлять признак? Если нет, что я могу сделать вместо этого? Пытаюсь сделать:
trait Foo {
/// A trait representing all types that can be returned from baz()
type ReturnType;
fn baz(&self) -> Self::ReturnType;
}
Самая большая проблема, с которой я сталкиваюсь, связана с чертой Sized
, потому что мне нужна функция, которая возвращает вектор элементов типа, реализующего ReturnType
:
trait Foo {
type ReturnType;
// option 1
fn bar(&self) -> Vec<Self::ReturnType>;
// option 2
fn bar<T: Self::ReturnType>(&self) -> Vec<T>;
}
Проблема с вариантом 1 заключается в том, что ReturnType
не будет иметь размер, потому что это признак, а проблема с вариантом 2 заключается в том, что компилятор не распознает связанный тип как признак: failed to resolve. Use of undeclared type or module 'Self'
и use of undeclared trait name 'Self::ReturnType'
(что заставляет меня думать, что связанные типы могут не указываю черты)
РЕДАКТИРОВАТЬ: пример того, что я пытаюсь сделать
/// Represents all types that store byte-data instead of the actual
/// element
trait BufferedVec {
/// the trait representing types that can be converted from the byte-data
type FromBuffer;
/// return the data at the given index, converted into a given type
fn get<T: Self::FromBuffer>(&self, index: usize) -> T;
}
Реализация пользователя может быть
/// An implementation of a BufferedVec
struct MyBufferedVec<'a> {
data: &'a [Option<Vec<u8>>]
}
impl<'a> BufferedVec for MyBufferedVec<'a> {
type FromBuffer = MyFromTrait;
fn get<T: MyFromTrait>(&self, index: usize) -> T {
<T as MyFromTrait>::convert(self.data[index].as_ref())
}
}
trait MyFromTrait {
fn convert(val: Option<&[u8]>) -> Self;
}
impl MyFromTrait for i32 {
fn convert(val: Option<&[u8]>) -> i32 {
match val {
Some(ref bytes) => bytes[0] as i32,
None => 0
}
}
}
impl MyFromTrait for String {
fn convert(val: Option<&[u8]>) -> String {
match val {
Some(ref bytes) => String::from_utf8(bytes),
None => "".to_string()
}
}
}