2

すべてを同じモジュールに入れるよりも良い方法はありますか?

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( /* */ ) { /* */ };
}

ただし、これは実際には直観に反するように思えます。通常、呼び出し元が動作しているのに対し、関数変数が動作しているものであり、このように実行する場合は明らかにそうではありません。なので、何か良い方法があれば教えていただきたいです...

4

1 に答える 1