В ящике, которую я пишу, у меня есть несколько внутренних struct
открытых для пользователя страниц, которые разделяют некоторый код. Часть общего кода общедоступна, часть - внутренняя реализация. Чтобы эффективно обмениваться кодом, я использую макросы, но теперь, когда у проекта появилось больше функций, это становится грязным, и я не удовлетворен семантикой этого.
Я хотел бы использовать черту, но не раскрывая реализацию. Например:
pub trait MyTrait {
type Next;
// This function is for the user.
fn forward(&self) -> Self::Next {
self.do_the_job()
}
// This function is for the user.
fn stop(&self) {
self.do_the_job();
}
// This function is an implementation detail.
fn do_the_job(&self) -> Self::Next;
}
Я хочу, чтобы пользователь видел и использовал forward
и stop
, но не do_the_job
, тогда как мои данные будут реализовывать только do_the_job
.
Можно ли спроектировать мой код, чтобы сделать что-то подобное? Я пытался представить некоторые решения, но мне в голову ничего не пришло.
Детская площадка
На объектно-ориентированном языке с наследованием я бы сделал (псевдокод):
public interface MyTrait {
type Next;
fn forward(&self) -> Self::Next;
fn stop(&self);
}
public abstract class MyCommonCode extends MyTrait {
fn forward(&self) -> Self::Next {
self.do_the_job()
}
fn stop(&self) {
self.do_the_job();
}
protected abstract fn do_the_job(&self) -> Self::Next;
}
public MyType extends MyCommonCode {
type Next = i32;
protected override fn do_the_job(&self) -> Self::Next {
// etc.
}
}