#rust #visibility
#Ржавчина #видимость
Вопрос:
TL;DR Я понял, что мне не нужно предоставлять какую-либо видимость структуре функции, если я хочу использовать ее в (sub) ^ -модуле. Соблюдая уровень подмодуля, просто напишите use super::{<my-code>};
с super::
повторением количества раз в качестве уровня подмодуля.
Редактировать: я добавил небольшой пример кода, чтобы лучше продемонстрировать мою проблему.
Время от времени я сталкиваюсь с архитектурной проблемой: «Этот файл уже слишком большой?» Поэтому позвольте мне представить начальный код.
mod module {
struct Parameter {}
struct Foo{}
fn test_foo(foo: Foo, param: Parameter) -> bool {
unimplemented!()
}
}
Чтобы устранить проблему со слишком большими файлами кода, я реструктурирую файл в модуль и помещаю каждый автономный набор кода в подмодуль. Пусть примером этого будет следующее:
crate
└── module
└── submoduleA
Адаптация кода в любом подмодуле довольно проста. Чтобы сделать код mod
модуля видимым в mod
подмодуле, я просто комментирую соответствующий фрагмент кода, который я пишу use super::{<my-code>};
в начале файла подмодуля. Код может выглядеть следующим образом:
mod module {
struct Parameter {}
mod submoduleA {
use super::Parameter;
struct Foo {}
fn test_foo(foo: Foo, param: Parameter) -> bool {
unimplemented!()
}
}
}
Теперь это становится пикантным. Что, если мне придется реструктурировать подмодуль? Пусть примером этого будет следующее:
crate
└── module
└── submoduleA
└── subsubmoduleA
Какой тип видимости я должен добавить для фрагмента кода в файле модуля, если я хочу, чтобы код модуля был виден на уровне subsubmodule? И как мне ввести этот фрагмент кода в мой подмодуль?
Следующий фрагмент кода не работает:
mod module {
struct Parameter {}
mod submoduleA {
mod subsubmoduleA {
use super::super::Parameter;
struct Foo {}
fn test_foo(foo: Foo, param: Parameter) -> bool {
unimplemented!()
}
}
}
}
Комментарии:
1. Я в замешательстве. Вам не нужен какой-либо
pub
спецификатор, чтобы сделать элементы в модуле видимыми для его собственных подмодулей; это всегда так. Можете ли вы уточнить, какой модуль определяет, а какой является пользователем?2. Спасибо за ответ и извините, что беспокою вопросом. Теперь я также понял, что вы имели в виду, и решил свою дилемму.
3. Рад, что смог помочь, даже случайно.