mod root {
mod foo {
pub struct Foo {
i: i32,
}
}
mod bar {
pub struct Bar {
f: ::root::foo::Foo,
}
impl Bar {
pub fn new(i: i32) -> Self {
Bar { f: ::root::foo::Foo { i: i } }
}
}
}
}
fn main() {}
playgroundДоступ частных полей из различных модулей
Пользователь должен иметь возможность взаимодействовать с Foo
, но пользователь не должен иметь возможность построить его вручную, так как это небезопасно.
Модуль bar
должен все еще иметь возможность создавать Foo. Насколько я знаю, единственный способ сделать это - поставить Foo
внутри модуля root
или внутри модуля bar
.
Есть ли более чистый способ решить эту проблему? Я назвал модули здесь foo
и bar
, но в моем коде они представляют собой отдельные файлы, такие как foo.rs
bar.rs
. Можно ли положить foo.rs
bar.rs
в тот же модуль, чтобы они могли видеть частные поля, но все же жить в отдельных файлах?
Мое настоящее обходное решение состояло в том, чтобы разоблачить общественный небезопасный метод для Foo.
Почему бы вам не написать функцию «Foo :: new», которая безопасно создает «Foo»? –
Не могли бы вы настроить getter для частного var, к которому хотите получить доступ? Таким образом, вы можете защитить любой доступ. Вы также можете сделать что-то вроде конструктора Foo (так используя новый), запустите конструкцию таким образом, чтобы она была успешной, только если выполнено какое-либо условие, например, требуемый аргумент конструктора arg должен быть экземпляром квалификационного компонент и т. д. Вы не можете создать компонент, не поставляя конкретный экземпляр определенного типа, и если он уже сконструирован, не создавайте новый, не возвращайте существующий, а другой - такой. –