нет
не может оно тебе дать такое скомпилить
нет, методы нужно перетащить в реализацию
точнее, объявить (без тела) в трейте и реализовать в реализации
достижимо с помощью всякой особой магии типа struct Entity<K: EntityKind> { // common fields here specific: K::Specific, } struct Specific1; struct Specific1Fields { // fields, specific for Specific1 } trait EntityKind { type Specific; } impl EntityKind for Specific1 { type Specific = Specific1Fields; }
Осталось разобраться, что делать с тайпами👀
с тайпами чего? в Specific пихаются все поля, которые специфичны для конкретного репозитория т. е. в твоём случае у тебя будет, услонво struct Repository<K: EntityKind> { client: Option<Client>, elements: HashMap<i32, K>, specific: K::Specific, } trait EntityKind { type Specific; } struct ChapterSpecific { // поля, которые нужны только для Repository<Chapter> } impl EntityKind for Chapter { type Specific = ChapterSpecific; }
Крч, вышло что-то вот такое и оно даже компилируется.
Не принято так делать. Принято передавать генерик, а имплементацию уже для определенного баунда делать. Надеюсь, меня поправят если я не прав
Можно просто Entity<K>, а потом указывать К как E::Specific
Не знаю, правильно ли я тебя понял, но вышло что-то такое. (Компилится и работает)
но вообще ты как будто бы нигде не используешь баунд Specific = E
Но вот такое же работает. Т.е. всё-таки выполняется.
это довольно странно, но видно, что у тебя не Repository<Chapter>, а Repository<ChapterSpecific> вместо этого
а сам Chapter, получается, не используется?
Да. Я удалил уже структуру Chapter. Не нужна.
трейт с ассоциированным типом тебе тогда тоже не нужен
А без него как мне указывать, что я хочу прокинуть тот или иной Specific?
Обсуждают сегодня