в этом трейте) для структуры имплементирующей этот трейт. Грубо говоря хочу сделать трейт у которого будут методы a(), b(), c(), d(), e() с дефолтной реализацией. Так-же будут разные структуры которые будут имплементировать этот трейт, но для некоторых структур я не хочу чтобы был доступен метод d(), для некоторых метод a() итд. Такое реально сделать?
Разделите методы на более мелкие группы и поместите каждую группу в трейт свой.
допустим, так можно было бы делать что делать с таким кодом? trait Trait { fn func(self); } fn foo(val: impl Trait) { val.func(); } struct Struct; impl Trait for Struct { fn func() = unimplemented; // invalid rust actually but anyway } fn main() { let s = Struct; foo(s); }
А что этот код должен делать? Кидать панику или не проходить компиляцию? В первом случае fn func() { unimplemented!() };, во втором - убрать impl Trait for Struct
Думаю более уместным будет такой пример, чтобы показать, чего изначально хотел автор и в чём проблема: trait Trait { fn foo(self); fn bar(self); } fn foo_call(val: impl Trait) { val.foo(); } fn bar_call(val: impl Trait) { val.bar(); } struct StructOne; struct StructTwo; impl Trait for StructOne { fn foo() { println!("foo"); } fn bar() = unimplemented; // invalid rust actually but anyway } impl Trait for StructTwo { fn foo() = unimplemented; // invalid rust actually but anyway fn bar() { println!("bar"); } } fn main() { let s1 = StructOne; foo_call(s1); bar_call(s1); let s2 = StructTwo; foo_call(s2); bar_call(s2); }
Так тут вроде нет никаких проблем, дженерики же мономорфизируются, компилятор подставит конкретный тип, увидит что для этого типа в реализации трейта конкретный метод исключен и выкинет ошибку при компиляции.
В расте не темплейты, а дженерики. Подразумевается что fn a<T: Trait>(){} Работает для всех T: Trait, а не только для некоторых. Если добавить возможность которую вы хотите, то даже изменение внутренностей функции будет ломающим изменениям: fn a<T: Trait>(){ - T::x(); + T::y() }
вроде ж вот ответили уже общепринятую практику. не годится?
Обсуждают сегодня