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

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

7 ответов

8 просмотров

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

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

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

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

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

всем привет. я правильно понимаю, что в телеграфе 4, если сессию указать у сообщения с коллбеком (кликнул на кнопку и установил сессию), то она не сохраняется?
Тимур
1
Ребята, я за проф советом😅 По микросервисам. В монолите есть общие файлы для сервисов: фетчи, конфиги, либы, утилсы.. как при распиле правильно их поддерживать? Пока вариант д...
Александр Тарасюк
1
а что делать если тебя убивают на картах?
Yarik yarik kyda ti lezesh
43
Подскажите где можно прочитать про реализацию возможности писать человеку при подписке на телеграм канал от имени бота? Было бы не плохо если для Telegraf@3.38.0
Pan Lipton
10
Мне вот что интересно, кто на рфе стартовал/играл, что вы фармили, в каком виде контента он прямо хорош? Экспедиция? Вроде прямо на замазанных мапах рф сдувается
Владислав
20
‌/r/pathofexile moderation changes top scoring links : pathofexile (RSS) Hi, everyone. On behalf of the subreddit mod team, I’m here to give you a few updates on the subreddi...
Esionru
3
Кто нибудь поясните это всё таки вброс или да? Про санктум слышал на поедб вбросили, а по дурке откуда инфа и на сколько это вообще правда? Пахнет шизофренией какой-то ✅Divi...
Dmitry Ritter
9
У вас бывает ощущение, что хочется потратить весь отпуск на то, чтоб только спать?
Николай
15
У меня вопрос к знающими, стоит ли вступать в гильдии в игре или лучше полная свобода?
Енот Полоскун
17
Как можно настроить фильтр в пое под себя?
Yarik yarik kyda ti lezesh
15
Карта сайта