Какой параметр видимости присваивать структурам и функциям, которые должны быть видны в подчиненном модуле?

#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. Рад, что смог помочь, даже случайно.