мусора?
я просто хочу запилить дженерик интерфейс через который можно будет через опции командной строки выбирать стратегию сборки мусора
соответственно как я себе это представляю
есть трейты GcRuntime<T> и GcBox<T> (первый в общем разруливает поведение gc, второй - обёртка над хранимыми данными)
выглядеть они могут допустим как-то так
pub trait GcRuntime<T> {
type BoxType: GcBox<T>;
fn alloc(&mut self, value: T) -> Self::BoxType;
}
pub trait GcBox<T> {
// что сюда пихать я пока не придумал, но на всякий допустим пусть будет отдельный трейт
}
ну и допустим я для начала хочу в качестве стратегии сборки использовать обычный счётчик ссылок
рантайма для него никакого не нужно, GcBox - это std::rc::Rc
struct RcRuntime;
impl<T> GcRuntime<T> for RcRuntime {
type BoxType = Rc<T>;
fn alloc(&mut self, value: T) -> Rc<T> {
Rc::new(value)
}
}
impl<T> GcBox<T> for Rc<T> {}
Ну ок, допустим оно должно работать
Теперь есть вот такое вот определение объекта в языке (по сути стыренное):
type ObjectRef = Rc<Object>;
#[derive(PartialEq, Debug, Clone)]
pub struct Object {
pub version: u64,
pub name: Option<String>,
pub content: ObjectContent,
pub class: ObjectRef,
pub bases: Option<Vec<ObjectRef>>,
pub attributes: Option<HashMap<String, ObjectRef>>,
}
// тут ещё struct ObjectContent и др.
Ну вот и теперь пытаюсь переписать на дженериках
pub struct Object<O: GcRuntime<Object<O>>> {
pub version: u64,
pub name: Option<String>,
pub content: ObjectContent<O>,
pub class: O::BoxType,
pub bases: Option<Vec<O::BoxType>>,
pub attributes: Option<HashMap<String, O::BoxType>>,
}
pub enum ObjectContent<O: GcRuntime<Object<O>>> {
None,
Bool(bool),
Int(i64),
Float(f64),
Str(String),
List(Vec<Object<O>>),
Tuple(Vec<Object<O>>),
Code(CodeObject),
Function(Function<O>),
NativeFunction(fn(Vec<Object<O>>) -> Object<O>),
}
pub struct Function<O: GcRuntime<Object<O>>> {
name: String,
code: CodeObject,
closure: Vec<Object<O>>,
}
// TODO
pub struct CodeObject;
Воот, оно вроде компилится, но получился какой-то дженерик-адок, и я не уверен что вообще сам подход верен. Может лучше уйти в динамику и использовать какой-нибудь Any вместо BoxType? Или может подход вообще в корне не верен? Может кто-нибудь подсказать кто шарит?
блин, полотно получилось вынести в гист?
а зачем тебе вообще дженерики?
Обсуждают сегодня