172 похожих чатов

Хотя проблема здесь наверное не в приватных методах, а в

том, что X приватный. Как это можно обойти?

16 ответов

3 просмотра

Сделать X публичным. Как это не странно. Ну по крайней мере как я понял с твоего абстрактного описания (лучше б 10 строчек кода на плейграунде б сделал). Он используется в публичном интерфейсе, значит должен быть публичным. То что ты в явном виде сейчас не видишь Х, не означает, что Х не нужен компилятору. И метод foo.bar() из A<X> ,будет развернут в что-то типа <Foo as A<X>>::bar(& foo).

Ilya-Lakhin Автор вопроса
Vladimir
Сделать X публичным. Как это не странно. Ну по кра...

Да, я в конечном итоге так и сделал. Проблема в том, что у x нет публичных методов, полей и конструктора. Его нельзя ни откуда публично получить. Это так специально сделано, и по уму и сам тип тогда должен быть приватным, но в результате он будет публичный в крейте, и непонятно зачем

Ilya Lakhin
Да, я в конечном итоге так и сделал. Проблема в то...

Даже если его нет на уровне объектов у пользователя, ты зачем-то его используешь на уровне типов. А значит всё-таки он нужен. Например в случае конфликтов имён методов, пользователю явно нужно будет указать откуда этот метод. Тогда он этот Х точно затребует.

Ilya-Lakhin Автор вопроса
Vladimir
Даже если его нет на уровне объектов у пользовател...

Вообще, я этот "паттерн"(с трейтами A и B, который я описал) использовал для того, чтобы обобщить повторяющуюся часть имплементации нескольких частично схожих объектов в своем крейте. При этом B мне фактически нужен только для того, чтобы получать приватную информацию об объекте(собственно это и есть тот самый X), а A делает фактическую имплементацию через дефолтную имплементацию собственных трейтных методов. Может быть это можно было сделать как-то проще?

Ilya Lakhin
Вообще, я этот "паттерн"(с трейтами A и B, который...

1. Ну скорее всего у тебя тут Х не тайп параметр, а ассоциативный тип должен быть. 2. trait A: B, боунд наверное тоже не обязателен, так как B у тебя просто "детали реализации". 3. Ну и вообще трейт B, имхо, это попытка натянуть ООП, на Раст, по хорошему Трейт должен описывать поведение, а не реализовывать доступ к полям. Как это можно написать учитывая 1-2: trait B { type X; fn inner(&mut self) -> &mut Self::A } impl B for S<T>{type X = T;...} ... trait A{ fn reset(&mut self); } impl<X> A for X where X: B, <X as B>::X : Default, { fn reset(&mut self) ->{* self.inner = Default::default()} }

Ilya-Lakhin Автор вопроса
Vladimir
1. Ну скорее всего у тебя тут Х не тайп параметр, ...

@c_vld Как вы предложили, сделать к сожалению не получилось. Я сделал B как pub(crate)(в противном случае inner() был бы публично доступен, что противоречит самой цели), и он тогда ругается, что "crate-visible trait B in public interface" на impl<X> A for X where X: B, <X as B>::X : Default,

Ilya Lakhin
@c_vld Как вы предложили, сделать к сожалению не п...

Кто мешает засилить трейт, чтобы другие крейты не могли имплементить трейт?

Ilya-Lakhin Автор вопроса
Эрик
screenshot

Так и что мне это даст? Если я impl в приватный модуль запихаю, у меня этого имлпа не будет в публичном интерфейса крейта

Ilya Lakhin
Так и что мне это даст? Если я impl в приватный мо...

Не, пихаешь ты его в pub, но он зависит от private Sealed трейта, так что только ты можешь его имплементить.

Ilya-Lakhin Автор вопроса
Эрик
Не, пихаешь ты его в pub, но он зависит от private...

А, ну ок, так заработало. Но все равно X получается должен быть публичным

Ilya-Lakhin Автор вопроса
Ilya Lakhin
В смысле, то что inner возвращает

А какая разница, если только ты терйт можешь имплементить?

Ilya-Lakhin Автор вопроса
Эрик
А какая разница, если только ты терйт можешь импле...

Ну, это не критично, но некоторый недостаток. Я буду вынужден типы для Inner делать публичными, оставляя при этом все что можно у них приватным(конструктор, акцессоры и т.п.). Он по уму бы тогда и сам должен был бы быть приватным. Это некая характеристика, которую хотелось бы получить в конечном итоге

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта