Можно как-то убрать возможность вызова определенного метода трейта (который реализован

в этом трейте) для структуры имплементирующей этот трейт. Грубо говоря хочу сделать трейт у которого будут методы a(), b(), c(), d(), e() с дефолтной реализацией. Так-же будут разные структуры которые будут имплементировать этот трейт, но для некоторых структур я не хочу чтобы был доступен метод d(), для некоторых метод a() итд. Такое реально сделать?

7 ответов

27 просмотров

Разделите методы на более мелкие группы и поместите каждую группу в трейт свой.

допустим, так можно было бы делать что делать с таким кодом? 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

red75prime
А что этот код должен делать? Кидать панику или не...

Думаю более уместным будет такой пример, чтобы показать, чего изначально хотел автор и в чём проблема: 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); }

Rusty brain-Krasilnikov Автор вопроса
Алиса Кассель-Королёва
допустим, так можно было бы делать что делать с та...

Так тут вроде нет никаких проблем, дженерики же мономорфизируются, компилятор подставит конкретный тип, увидит что для этого типа в реализации трейта конкретный метод исключен и выкинет ошибку при компиляции.

Rusty brain Krasilnikov
Так тут вроде нет никаких проблем, дженерики же мо...

В расте не темплейты, а дженерики. Подразумевается что fn a<T: Trait>(){} Работает для всех T: Trait, а не только для некоторых. Если добавить возможность которую вы хотите, то даже изменение внутренностей функции будет ломающим изменениям: fn a<T: Trait>(){ - T::x(); + T::y() }

ChzChz
Разделите методы на более мелкие группы и поместит...

вроде ж вот ответили уже общепринятую практику. не годится?

Похожие вопросы

Обсуждают сегодня

Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
Ребята, всем привет. Подскажите, пожалуйста, можно ли как-то через бота понять, что этого бота добавили в группу\канал и выдали ему права администратора?
Artem Stormageddon
9
Привет всем! Почему этот код не срабатывает при добавлении или удалении пользователя из чата? bot.on('chat_member', async (ctx) => { console.log(ctx); }) bot.launch({allo...
Alexander
7
Всем привет. Не понимаю, в чём тут шутка юмора. Убирается только разрешение на send_messages. А send_media_messages остаётся. Как сделать, чтобы оба убирались? await b...
Alexander
2
Есть тут кто занимается разработкой серваков майна? Или знакомые
meow *
3
'frakturBold' => ['𝖆', '𝖇', '𝖈', '𝖉', '𝖊', '𝖋', '𝖌', '𝖍', '𝖎', '𝖏', '𝖐', '𝖑', '𝖒', '𝖓', '𝖔', '𝖕', '𝖖', '𝖗', '𝖘', '𝖙', '𝖚', '𝖛', '𝖜', '𝖝', '𝖞', '𝖟', '𝕬', '𝕭', '𝕮', '𝕯'...
Roma
4
Есть ли лимиты на кол-во вебхук по домену? Стоит в данный момент 900+ ботов и бывает бот перестает отвечать (не приходят вебхуки) 🐒 Помогает только перезапуск
ᅠ [ Кому не ответил, дублируйте ]
11
Товарищи, здравствуйте Подскажите, пожалуйста, может кто-нибудь сталкивался с такой задачей Через вебапку можно сканировать qr-код, а есть ли возможность считывать nfc?
Artem Stormageddon
8
а что делать если тебя убивают на картах?
Yarik yarik kyda ti lezesh
43
Карта сайта