すべてを同じモジュールに入れるよりも良い方法はありますか?
sub_module.rs
pub struct GiantStruct { /* */ }
impl GiantStruct {
// this method needs to be called from outside of the crate.
pub fn do_stuff( /* */ ) { /* */ };
}
lib.rs
pub mod sub_module;
use sub_module::GiantStruct;
pub struct GiantStructBuilder{ /* */ }
impl GiantStructBuilder{
pub fn new_giant_struct(&mut self) -> GiantStruct {
// Do stuff depending on the fields of the current
// GiantStructBuilder
}
}
問題は次のとおりGiantStructBuilder::new_giant_struct()
です。このメソッドは新しいを作成するGiantStruct
必要がありますが、これを行うには、pub fn new() -> GiantStruct
内またsub_module.rs
はすべてのフィールドGiantStruct
がパブリックである必要があります。どちらのオプションでも、クレートの外からアクセスできます。
この質問を書いているときに、次のようなことができることに気付きました。
sub_module.rs
pub struct GiantStruct { /* */ }
impl GiantStruct {
// now you can't call this method without an appropriate
// GiantStructBuilder
pub fn new(&mut GiantStructBuilder) -> GiantStruct { /* */ };
pub fn do_stuff( /* */ ) { /* */ };
}
ただし、これは実際には直観に反するように思えます。通常、呼び出し元が動作しているのに対し、関数変数が動作しているものであり、このように実行する場合は明らかにそうではありません。なので、何か良い方法があれば教えていただきたいです...